Spark ----driver executor運行圖:
圖 1-1 driver-----executor 運行圖
-----TaskSetManager結構圖:
圖 1-2 TaskSetManager 結構
Spark Task的調度是由TaskScheudler來完成的,DAGScheduler將stage打包到taskSet並交給TaskScheduler,TaskScheduler會將TaskSet分裝爲TaskManager,加入到調度隊列中。
TaskSetManager負責監控同一個stage中的tasks,TaskScheduler是以TaskManager爲單元進行調度的。
TaskScheduler初始化之後,SchedulerBackend啓動,SchedulerBackend會定時詢問TaskScheduler有沒有需要執行的task任務,TaskScheduler在SchedulerBackend詢問它的時候會從調度隊列中按照指定的調度策略選擇TaskSetManager去調度運行。
----大致的方法調用流程如下圖:
DAGScheduler劃分stage之後將stages分發到TaskScheduler中,此時啓動taskScheduler.submitTasks方法。
TaskScheduler中執行流程:
taskScheduler.submitTasks方法被調用提交taskSet,
根據taskSet的數量創建相應的TaskSetManager,
調用schedulableBuilder對象將創建的TaskManager放到TaskSetPool中。
然後就是調用schedulerBackend對象的reviveOffers方法,
此方法內部再調用makeOfficers方法,schedulerBackend查看可用的executor數量,
此時taskScheduler開始調用resourceOffers方法,記錄用來執行每個task相應的executor容器,
最後rootPool對象調用getSortedTaskSetQueue方法來找到TaskSetPool中對應的task放到對應的executor中開始執行。