概要
本篇部落格是Spark 任務排程概述詳細流程中的第七部分,介紹Driver發送task到Executor的過程。
執行使用者編寫代碼
Spark 任務排程之Register App中介紹了Driver中初始化SparkContext對象及注冊APP的流程,SparkContext初始化完畢後,執行使用者編寫代碼,仍以SparkPi為例,如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90zZNNTRE5kMVRVT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jN0kDNxQjMwIDNwQDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
如上圖,SparkPi中調用RDD的reduce,reduce中
調用SparkContext.runJob方法送出任務,SparkContext.runJob方法調用DAGScheduler.runJob方法,如下
DAGScheduler生成task
DAGScheduler中,根據rdd的Dependency生成stage,stage分為ShuffleMapStage和ResultStage兩種類型,根據stage類型生成對應的task,分别是ShuffleMapTask、ResultTask,最後調用TaskScheduler送出任務,如下圖。
這裡我們隻關注流程,DAGScheduler的具體細節後續介紹。
TaskScheduler送出task
TaskScheduler中使用TaskSetManager管理TaskSet,submitTasks方法最終調用CoarseGrainedSchedulerBackend的launchTasks方法将task發送到Executor,如下
executorDataMap中儲存了Executor的連接配接方式,關于Executor如何注冊到executorDataMap中,參考Spark 任務排程之建立Executor。
Executor接收Task
Worker節點的CoarseGrainedExecutorBackend程序接收Driver發送的task,交給Executor對象處理,如下
Executor的建立過程請參考Spark 任務排程之建立Executor。
至此從RDD的action開始,至Executor對象接收任務的流程就結束了。
總結
介紹了從RDD的action開始,到Executor接收到task的流程,其中省略了DAG相關的部分,後續單獨介紹,整理流程大緻如下