爲了更好地理解調度,先來鳥瞰一下集羣模式下的Spark程序運行架構圖。shell
cluster manager:集羣管理器,也就是master,負責集羣的資源調度。apache
好比:爲Worker Node分配CPU、內存等資源。並實時監控Worker的資源使用狀況。一個Worker Node默認狀況下分配一個Executor(進程)。緩存
從圖中能夠看到sc和Executor之間畫了一根線條,這代表:程序運行時,sc是直接與Executor進行交互的。因此,cluster manager只是負責資源的管理調度,而任務的分配和結果處理它無論。架構
負責程序運行的開始和結束。併發
用戶編寫的Spark程序稱爲Driver Program。每一個Driver程序包含一個表明集羣環境的SparkContext對象,程序的執行從Driver程序開始,全部操做執行結束後回到Driver程序中,在Driver程序中結束。框架
若是你是用spark shell,那麼當你啓動Spark shell的時候,系統後臺自啓了一個Spark驅動器程序,就是在Spark shell中預加載的一個叫做sc的SparkContext對象。若是驅動器程序終止,那麼Spark應用也就結束了。spa
每一個Driver Program裏都有一個SparkContext對象,職責有以下兩個:.net
SparkContext對象聯繫cluster manager(集羣管理器),讓cluster manager爲Worker Node分配CPU、內存等資源。此外,cluster manager會在Worker Node上啓動一個執行器(專屬於本驅動程序)。orm
SparkContext對象和Executor進程交互,負責任務的調度分配。對象
Worker節點。集羣上的計算節點,對應一臺物理機器。
它對應Worker進程,用於和Master進程交互,向Master註冊和彙報自身節點的資源使用狀況,並管理和啓動Executor進程。
負責運行Task計算任務,並將計算結果回傳到Driver中。
在執行器上執行的最小單元。好比RDD Transformation操做時對RDD內每一個分區的計算都會對應一個Task。
如上圖,以前提到Driver的sc負責和Executor交互,完成任務的分配和調度,在底層,任務調度模塊主要包含兩大部分:DAGScheduler、TaskScheduler。
它們負責將用戶提交的計算任務按照DAG劃分爲不一樣的階段而且將不一樣階段的計算任務提交到集羣進行最終的計算。整個過程可使用下圖表示:
能夠理解爲用戶實際代碼中建立的RDD,這些代碼邏輯上組成了一個DAG。
主要負責分析依賴關係,而後將DAG劃分爲不一樣的Stage(階段),其中每一個Stage由能夠併發執行的一組Task構成,這些Task的執行邏輯徹底相同,只是做用於不一樣的數據。
在DAGScheduler將這組Task劃分完成後,會將這組Task提交到TaskScheduler。TaskScheduler經過Cluster Manager 申請計算資源,好比在集羣中的某個Worker Node上啓動專屬的Executor,並分配CPU、內存等資源。接下來,就是在Executor中運行Task任務,若是緩存中沒有計算結果,那麼就須要開始計算,同時,計算的結果會回傳到Driver或者保存在本地。
任務調度模塊涉及的最重要的三個類是:
1)org.apache.spark.scheduler.DAGScheduler前面提到的DAGScheduler的實現。
2)org.apache.spark.scheduler.TaskScheduler
它的做用是爲建立它的SparkContext調度任務,即從DAGScheduler接收不一樣Stage的任務,而且向集羣提交這些任務,併爲執行特別慢的任務啓動備份任務。
3)org.apache.spark.scheduler.SchedulerBackend
是一個trait,做用是分配當前可用的資源,具體就是向當前等待分配計算資源的Task分配計算資源(即Executor),而且在分配的Executor上啓動Task,完成計算的調度過程。
任務調度流程圖
根據對以上信息的理解,我本身畫了一個任務執行流程-關係圖,以下:
上一篇:Spark框架核心概念
下一篇:Spark Shuffle