Spark任務提交執行全流程詳解
阿新 • • 發佈:2018-11-24
**
Spark任務提交執行流程
**
Spark任務的本質是對我們編寫的RDD的依賴關係切分成一個個Stage,將Stage按照分割槽分批次的生成TaskSet傳送到Executor進行任務的執行
Spark任務分兩種:
1、shuffleMapTask:shuffle之後的task
2、resultTask:shuffle之前的task
Spark任務分配有兩種方式:
1,儘量打撒方式(系統預設)
2,儘量集中方式
首先把App打包上傳到叢集上,並開始分配資源及呼叫包中的主類
然後
- 在Driver端,呼叫SparkSubmit類,內部執行submit–>doRunMain–>通過反射獲取應用程式的主類物件(遠端代理物件)–>執行主類的main方法,這是提交,
- Driver端構建SparkConf和SparkContext物件,在SparkContext入口類做了三件事,建立了SparkEnv物件(建立了ActorSystem物件)、TaskScheduler(用來生成併發送task給Executor)、DAGScheduler(用來劃分Stage)
- ClientActor將任務資訊封裝到ApplicationDescription物件裡並且提交給Master
- Master收到ClientActor提交的任務資訊後,把任務資訊存到記憶體中,然後又將任務資訊放到佇列中(waitingApps)
- 當開始執行這個任務資訊時,呼叫scheduler方法,進行資源排程。
- 將排程好的資源封裝到LaunchExecutor併發送給對應的Worker
- Worker接收到Master傳送過來的排程資訊(LaunchExecutor)後,將資訊封裝成一個ExecutorRunner物件
- 封裝成ExecutorRunner後,呼叫ExecutorRunner的Start方法,開始啟動CoarseGrainedExecutorBackend物件(啟動Executor)
- Executor啟動後向DriverActor進行反向註冊
- 與DriverActor註冊成功後,建立一個執行緒池(ThreadPool),用來執行任務
- 當所有Executor註冊完成後,意味著作業環境準備好了,Driver端會結束與SparkContext物件的初始化
- 當Driver初始化完成後(建立了一個sc示例),會持續執行我們自己提交的App的程式碼,當觸發了Action的RDD運算元時,就觸發了一個job,這時會呼叫DAGScheduler物件進行Stage劃分
- DAGScheduler開始進行Stage劃分
- 將劃分好的Stage按照分割槽生成一個一個的task,並且封裝到TaskSet物件,然後TaskSet提交到TaskScheduler
- TaskScheduler接收到提交過來的TaskSet,拿到一個序列化器對TaskSet序列化,將序列化好的TaskSet封裝到LaunchExecutor並提交到DriverActor
- DriverActor把LaunchExecutor傳送到Executor上
- Executor接收到DriverActor傳送過來的任務(LaunchExecutor),會將其封裝成TaskRunner,然後從執行緒池中獲取執行緒來執行TaskRunner
- TaskRunner拿到反序列化器,反序列化TaskSet,然後執行App程式碼,也就是對RDD分割槽上執行的運算元和自定義函式