Spark作業調度
對RDD的操作分為transformation和action兩類,真正的作業提交運行發生在action之后,調用action之后會將對原始輸入數據的所有transformation操作封裝成作業並向集群提交運行。這個過程大致可以如下描述:
- 由DAGScheduler對RDD之間的依賴性進行分析,通過DAG來分析各個RDD之間的轉換依賴關系
- 根據DAGScheduler分析得到的RDD依賴關系將Job划分成多個stage
- 每個stage會生成一個TaskSet並提交給TaskScheduler,調度權轉交給TaskScheduler,由它來負責分發task到worker執行
接下來,理解 Spark 中RDD的依賴關系.
RDD依賴關系
Spark中RDD的粗粒度操作,每一次transformation都會生成一個新的RDD,這樣就會建立RDD之間的前后依賴關系,在Spark中,依賴關系被定義為兩種類型,分別是窄依賴和寬依賴
- 窄依賴,父RDD的分區最多只會被子RDD的一個分區使用,
- 寬依賴,父RDD的一個分區會被子RDD的多個分區使用(寬依賴指子RDD的每個分區都要依賴於父RDD的所有分區,這是shuffle類操作)
圖中左邊都是窄依賴關系,可以看出分區是1對1的。右邊為寬依賴關系,有分區是1對多。(map,filter,union屬於第一類窄依賴)
stage的划分
stage的划分是Spark作業調度的關鍵一步,它基於DAG確定依賴關系,借此來划分stage,將依賴鏈斷開,每個stage內部可以並行運行,整個作業按照stage順序依次執行,最終完成整個Job。實際應用提交的Job中RDD依賴關系是十分復雜的,依據這些依賴關系來划分stage自然是十分困難的,Spark此時就利用了前文提到的依賴關系,調度器從DAG圖末端出發,逆向遍歷整個依賴關系鏈,遇到ShuffleDependency(寬依賴關系的一種叫法)就斷開,遇到NarrowDependency就將其加入到當前stage。stage中task數目由stage末端的RDD分區個數來決定,RDD轉換是基於分區的一種粗粒度計算,一個stage執行的結果就是這幾個分區構成的RDD。
圖中可以看出,在寬依賴關系處就會斷開依賴鏈,划分stage,這里的stage1不需要計算,只需要計算stage2和stage3,就可以完成整個Job。
總結:遇到一個寬依賴就分一個stage
參考博客:https://blog.csdn.net/mahuacai/article/details/51919615