spark的任務調度系統以下所示:web
從上圖中能夠看出來由RDD Objects產生DAG,而後進入了DAGScheduler階段,DAGScheduler是面向state的高層次的調度器,DAGScheduler把DAG拆分紅不少的tasks,每組的tasks都是一個state,每當遇到shuffle就會產生新的state,能夠看出上圖一共有三個state;DAGScheduler須要記錄那些RDD被存入磁盤等物化動做,同時需尋找task的最優化調度,例如數據本地性等;DAGScheduler還要監視由於shuffle輸出致使的失敗,若是發生這種失敗,可能就須要從新提交該state:數組
DAGScheduler劃分state後以TaskSet爲單位把任務,把任務交給底層次的可插拔的調度器TaskScheduler來處理:多線程
能夠看出TaskScheduler是一個trait,在目前spark系統中TaskScheduler的實現類只有一個TaskSchedulerImpl:優化
一個TaskScheduler只爲一個SparkContext實例服務,TaskScheduler接受來自DAGScheduler發送過來的分組的任務,DAGScheduler給TaskScheduler發送任務的時候是以Stage爲單位來提交的,TaskScheduler收到任務後負責把任務分發到集羣中Worker的Executor中去運行,若是某個task運行失敗,TaskScheduler要負責重試;另外若是TaskScheduler發現某個Task一直未運行完,就可能啓動一樣的任務運行同一個Task,那個任務先運行完就用哪一個任務的結果。
TaskScheduler發送的任務交給了Worker上的Executor以多線程的方式運行,每個線程負責一個任務:
spa
其中的存儲系統的管理是BlockManager來負責的:
線程
看一下TaskSet的源碼:
orm
從TaskSet源碼的第一個參數tasks就能夠看出其是一個Task的數組,包含一組Task。源碼