天天看點

Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結

概要

本篇部落格是Spark 任務排程概述詳細流程中的第七部分,介紹Driver發送task到Executor的過程。

執行使用者編寫代碼

Spark 任務排程之Register App中介紹了Driver中初始化SparkContext對象及注冊APP的流程,SparkContext初始化完畢後,執行使用者編寫代碼,仍以SparkPi為例,如下

Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結

如上圖,SparkPi中調用RDD的reduce,reduce中

調用SparkContext.runJob方法送出任務,SparkContext.runJob方法調用DAGScheduler.runJob方法,如下

Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結
Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結

DAGScheduler生成task

DAGScheduler中,根據rdd的Dependency生成stage,stage分為ShuffleMapStage和ResultStage兩種類型,根據stage類型生成對應的task,分别是ShuffleMapTask、ResultTask,最後調用TaskScheduler送出任務,如下圖。

這裡我們隻關注流程,DAGScheduler的具體細節後續介紹。

Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結

TaskScheduler送出task

TaskScheduler中使用TaskSetManager管理TaskSet,submitTasks方法最終調用CoarseGrainedSchedulerBackend的launchTasks方法将task發送到Executor,如下

Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結

executorDataMap中儲存了Executor的連接配接方式,關于Executor如何注冊到executorDataMap中,參考Spark 任務排程之建立Executor。

Executor接收Task

Worker節點的CoarseGrainedExecutorBackend程序接收Driver發送的task,交給Executor對象處理,如下

Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結

Executor的建立過程請參考Spark 任務排程之建立Executor。

至此從RDD的action開始,至Executor對象接收任務的流程就結束了。

總結

介紹了從RDD的action開始,到Executor接收到task的流程,其中省略了DAG相關的部分,後續單獨介紹,整理流程大緻如下

Spark 任務排程之Driver send Task概要執行使用者編寫代碼DAGScheduler生成taskTaskScheduler送出taskExecutor接收Task總結

繼續閱讀