Spark學習(三)——Stage和寬窄依賴

其餘更多java基礎文章:
java基礎學習(目錄)java


Stage生成和Stage源碼淺析
Spark技術內幕:Stage劃分及提交源碼分析函數

窄依賴和寬依賴

窄依賴:

指父RDD的每個分區最多被一個子RDD的分區所用,表現爲一個父RDD的分區對應於一個子RDD的分區,和兩個父RDD的分區對應於一個子RDD 的分區。圖中,map/filter和union屬於第一類,對輸入進行協同劃分(co-partitioned)的join屬於第二類。源碼分析

寬依賴:

指子RDD的分區依賴於父RDD的全部分區,這是由於shuffle類操做,如圖中的groupByKey和未經協同劃分的join。post

DAG

DAG,有向無環圖,Directed Acyclic Graph的縮寫,經常使用於建模。Spark中使用DAG對RDD的關係進行建模,描述了RDD的依賴關係,這種關係也被稱之爲lineage,RDD的依賴關係使用Dependency維護,參考Spark RDD之Dependency,DAG在Spark中的對應的實現爲DAGScheduler。學習

Stage

在spark中,會根據RDD之間的依賴關係將DAG圖劃分爲不一樣的階段,一個Job會被拆分爲多組TaskSet,每組任務被稱爲一個Stage。對於窄依賴,因爲partition依賴關係的肯定性,partition的轉換處理就能夠在同一個線程裏完成,窄依賴就被spark劃分到同一個stage中,而對於寬依賴,只能等父RDD shuffle處理完成後,下一個stage才能開始接下來的計算。spa

Stage劃分思路

  1. 所以spark劃分stage的總體思路是:從後往前推,遇到寬依賴就斷開,劃分爲一個stage;遇到窄依賴就將這個RDD加入該stage中。所以在上圖中RDD C,RDD D,RDD E,RDDF被構建在一個stage中,RDD A被構建在一個單獨的Stage中,而RDD B和RDD G又被構建在同一個stage中。線程

  2. 在spark中,Task的類型分爲2種:ShuffleMapTask和ResultTask;cdn

    • ResultTask:對於 DAG 圖中最後一個 Stage(也就是 ResultStage),會生成與該 DAG 圖中哦最後一個 RDD (DAG 圖中最後邊)partition 個數相同的 ResultTask
    • ShuffleMapTask:對於非最後的 Stage(也就是 ShuffleMapStage),會生成與該 Stage 最後的 RDD partition 個數相同的 ShuffleMapTask
  3. 每一個Stage裏面的Task的數量是由該Stage中最後一個RDD的Partition的數量所決定的blog

注意:同一個Stage的執行是串行的,好比Stage2的RDD C-D-F中,假設只有一個CPU core ,Spark是先將一條數據按C-D-F的順序執行完後,再運行下一條數據。而不是將全部數據從RDD C中計算到RDD D了,再往下計算RDD F。ip

總結

RDD的寬窄依賴的劃分是爲了劃分Stage,劃分Stage是爲了Pipline計算模型的實現,Pipline的計算模式可以以一種管道流的方式,以高階函數的形式實現數據的本地化,傳邏輯而不傳輸數據。在Pipline計算模式遇到持久化算子或者Shuffle(寬依賴算子)時候就會產生數據的落地。

相關文章
相關標籤/搜索