1. 程式人生 > >Spark任務提交執行全流程詳解

Spark任務提交執行全流程詳解

**

Spark任務提交執行流程

**

Spark任務的本質是對我們編寫的RDD的依賴關係切分成一個個Stage,將Stage按照分割槽分批次的生成TaskSet傳送到Executor進行任務的執行

Spark任務分兩種:

1、shuffleMapTask:shuffle之後的task

2、resultTask:shuffle之前的task

Spark任務分配有兩種方式:

1,儘量打撒方式(系統預設)

2,儘量集中方式

首先把App打包上傳到叢集上,並開始分配資源及呼叫包中的主類

然後

  1. 在Driver端,呼叫SparkSubmit類,內部執行submit–>doRunMain–>通過反射獲取應用程式的主類物件(遠端代理物件)–>執行主類的main方法,這是提交,
  2. Driver端構建SparkConf和SparkContext物件,在SparkContext入口類做了三件事,建立了SparkEnv物件(建立了ActorSystem物件)、TaskScheduler(用來生成併發送task給Executor)、DAGScheduler(用來劃分Stage)
  3. ClientActor將任務資訊封裝到ApplicationDescription物件裡並且提交給Master
  4. Master收到ClientActor提交的任務資訊後,把任務資訊存到記憶體中,然後又將任務資訊放到佇列中(waitingApps)
  5. 當開始執行這個任務資訊時,呼叫scheduler方法,進行資源排程。
  6. 將排程好的資源封裝到LaunchExecutor併發送給對應的Worker
  7. Worker接收到Master傳送過來的排程資訊(LaunchExecutor)後,將資訊封裝成一個ExecutorRunner物件
  8. 封裝成ExecutorRunner後,呼叫ExecutorRunner的Start方法,開始啟動CoarseGrainedExecutorBackend物件(啟動Executor)
  9. Executor啟動後向DriverActor進行反向註冊
  10. 與DriverActor註冊成功後,建立一個執行緒池(ThreadPool),用來執行任務
  11. 當所有Executor註冊完成後,意味著作業環境準備好了,Driver端會結束與SparkContext物件的初始化
  12. 當Driver初始化完成後(建立了一個sc示例),會持續執行我們自己提交的App的程式碼,當觸發了Action的RDD運算元時,就觸發了一個job,這時會呼叫DAGScheduler物件進行Stage劃分
  13. DAGScheduler開始進行Stage劃分
  14. 將劃分好的Stage按照分割槽生成一個一個的task,並且封裝到TaskSet物件,然後TaskSet提交到TaskScheduler
  15. TaskScheduler接收到提交過來的TaskSet,拿到一個序列化器對TaskSet序列化,將序列化好的TaskSet封裝到LaunchExecutor並提交到DriverActor
  16. DriverActor把LaunchExecutor傳送到Executor上
  17. Executor接收到DriverActor傳送過來的任務(LaunchExecutor),會將其封裝成TaskRunner,然後從執行緒池中獲取執行緒來執行TaskRunner
  18. TaskRunner拿到反序列化器,反序列化TaskSet,然後執行App程式碼,也就是對RDD分割槽上執行的運算元和自定義函式