TaskScheduler負責不同的Application的Jobs之間的調(diào)度销睁,在Task執(zhí)行失敗時啟動重試機制,并為執(zhí)行緩慢的Task啟動備份任務
SchedulerBackend負責與Cluster Manager交互,取得分配給Application的資源刷袍,并將資源傳給TaskScheduler米碰,由TaskScheduler為Task最終分配計算資源
TaskScheduler的創(chuàng)建
TaskScheduler通過org.apache.spark.SparkContext#createTaskScheduler創(chuàng)建。
// Create and start the scheduler
val(sched,ts) = SparkContext.createTaskScheduler(this,master)
def master:String = _conf.get("spark.master")
SparkContext.createTaskScheduler根據(jù)傳入Master的URL的規(guī)則判斷集群的部署方式堡掏,根據(jù)不同的部署方式生成不同的TaskScheduler和SchedulerBackend
createTaskScheduler會case不同的URL表達式生成TaskScheduler和SchedulerBackend应结。
SchedulerBackend是一個trait,作用是向等待分配計算資源的Task分配Executor,并啟動Task鹅龄。
Task的提交
DAGScheduler完成對Stage劃分后揩慕,按照Stage的劃分順序調(diào)用:org.apache.spark.scheduler.TaskScheduler#submitTasks 將Stage提交到TaskScheduler
submitTasks開始Task的資源調(diào)度,Task被分配到Executor扮休,在Worker上完成任務執(zhí)行迎卤,調(diào)用堆棧如下:
1)org.apache.spark.scheduler.TaskSchedulerImpl#submitTasks
2)org.apache.spark.scheduler.SchedulableBuilder#addTaskSetManager
3)org.apache.spark.scheduler.SchedulerBackend#reviveOffers
4)org.apache.spark.scheduler.TaskSchedulerImpl#resourceOffers
5)org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend.DriverEndpoint#launchTasks
6)org.apache.spark.executor.Executor#launchTask
此處分為Driver端、Executor執(zhí)行玷坠,1~5在Driver端蜗搔,6在Executor端。
1)將TaskSet加入TaskSetManager :
2)schedulableBuilder.addTaskSetManager(manager,manager.taskSet.properties)
schedulableBuilder是調(diào)度器八堡,支持兩種策略樟凄,F(xiàn)IFO(默認)和FAIR(公平調(diào)度)。通過spark.scheduler.mode設置秕重。schedulableBuilder會確定TaskSetManager的調(diào)度順序不同,根據(jù)就近原則確定運行Task的Executor。
5)def resourceOffers(offers: Seq[WorkerOffer]): Seq[Seq[TaskDescription]]
響應資源調(diào)度請求溶耘,為Task分配具體的資源二拐,輸入是Executor列表,輸出是TaskDescription二維數(shù)據(jù)凳兵,存儲Task ID百新、Executor ID和Task執(zhí)行環(huán)境依賴信息等。