spark排程管理

fan_rockrock發表於2016-03-24

一、排程相關基本概念

Task(任務):單個分割槽資料集上的最小處理流程單元。

TaskSet(任務集):由一組關聯的,但互相之間沒有Shuffle依賴關係的任務所組成的任務集。

Stage(排程階段):一個任務集對應的排程階段。

Job(作業):由一個RDD Action生成的一個或多個排程階段所組成的一次計算作業。

Application(應用程式):Spark應用程式,由一個或多個作業組成。



二、排程流程圖


三、DAGScheduler

1、構建Stage

當一個RDD操作觸發計算,向DAGScheduler提交作業時,DAGScheduler需要從RDD依賴鏈的末端的RDD出發,遍歷整個RDD鏈,劃分排程階段,排程階段是以ShuffleDependency為依據的



2、記錄哪個RDD或者Stage輸出被物化

通常在一個複雜的shuffle之後,通常物化一下(cache、persist),方便之後的計算

3、重新提交shuffle輸出丟失的stage

4、將Taskset傳給底層排程器

-spark-cluster :TaskScheduler

-yarn-cluster: YarnClusterScheduler


四、TaskScheduler和TaskSetManager

1、為每一個TaskSet構建一個TaskSetManager例項來管理這個TaskSet的生命週期

2、TaskSetManager會根據(1)上一次任務成功提交的時間 (2)process-local(有快取cache的節點),node-local,rack-local,any來決定每個Task的最佳位置

3、推測執行,TaskScheduler發現某個Task一直未執行完,就可能啟動同樣的任務執行同一個Task,哪個任務先執行完就用哪個任務的結果


五、二種Task

    shuffleMapTask和ResultTask,被執行的task多數是shuffleMapTask

1、ResultTask (FinalStage 所對應的任務)

返回給driver  的是運算結果本身
<1>
結果足夠 小 , 則直接 放在 DirectTaskResult  對 象 內
<2>
超過特定 尺寸 ( 預設約  10MB ) 則在 Executor  端會將DirectTaskResult  先 序 列 化, 再把 序
列 化的結果作為一個 資料塊 存放在 BlockManager  裡 , 而後將 BlockManager 返回的 BlockID
放在 IndirectTaskResult 物件中返回給 driver

2、shuffleMapTask

返回給DAGScheduler的是一個MapStatus物件,MapStatus物件管理了ShuffleMapTask的運算輸出結果在BlockManager裡面的相關儲存資訊,而非結果本身,這些儲存資訊將作為下一個Stage的任務的獲取輸入資料的依據

相關文章