Spark Stage 的划分


 

Spark作業調度

對RDD的操作分為transformation和action兩類,真正的作業提交運行發生在action之后,調用action之后會將對原始輸入數據的所有transformation操作封裝成作業並向集群提交運行。這個過程大致可以如下描述:

    • DAGSchedulerRDD之間的依賴性進行分析,通過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類操作)

 

rddependency

圖中左邊都是窄依賴關系,可以看出分區是1對1的。右邊為寬依賴關系,有分區是1對多。(map,filter,union屬於第一類窄依賴)

 

 

stage的划分

 

stage的划分是Spark作業調度的關鍵一步,它基於DAG確定依賴關系,借此來划分stage,將依賴鏈斷開,每個stage內部可以並行運行,整個作業按照stage順序依次執行,最終完成整個Job。實際應用提交的Job中RDD依賴關系是十分復雜的,依據這些依賴關系來划分stage自然是十分困難的,Spark此時就利用了前文提到的依賴關系,調度器從DAG圖末端出發,逆向遍歷整個依賴關系鏈,遇到ShuffleDependency(寬依賴關系的一種叫法)就斷開,遇到NarrowDependency就將其加入到當前stagestage中task數目由stage末端的RDD分區個數來決定,RDD轉換是基於分區的一種粗粒度計算,一個stage執行的結果就是這幾個分區構成的RDD。

圖中可以看出,在寬依賴關系處就會斷開依賴鏈,划分stage,這里的stage1不需要計算,只需要計算stage2和stage3,就可以完成整個Job。

 

 

總結:遇到一個寬依賴就分一個stage

 

 

 

 

 

 

 

 

參考博客:https://blog.csdn.net/mahuacai/article/details/51919615

                  https://wongxingjun.github.io/2015/05/25/Spark%E4%BD%9C%E4%B8%9A%E8%B0%83%E5%BA%A6%E4%B8%ADstage%E7%9A%84%E5%88%92%E5%88%86/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM