Spark中DAG生成過程如何劃分Stage?
1 什么是DAG?
在圖論中,如果一個有向圖無法從任意頂點出發(fā)經(jīng)過若干條邊回到該點,則這個圖是一個有向無環(huán)圖(DAG圖)。而在Spark中,由于計算過程很多時候會有先后順序,受制于某些任務(wù)必須比另一些任務(wù)較早執(zhí)行的限制,必須對任務(wù)進(jìn)行排隊,形成一個隊列的任務(wù)集合,這個隊列的任務(wù)集合就是DAG圖,每一個定點就是一個任務(wù),每一條邊代表一種限制約束(Spark中的依賴關(guān)系)。

2 DAG如何劃分Stage?
Spark中DAG生成過程的重點是對Stage的劃分,其劃分的依據(jù)是RDD的依賴關(guān)系,對于不同的依賴關(guān)系,高層調(diào)度器會進(jìn)行不同的處理。
●對于窄依賴,RDD之間的數(shù)據(jù)不需要進(jìn)行Shuffle,多個數(shù)據(jù)處理可以在同一臺機(jī)器的內(nèi)存中完成,所以窄依賴在Spark中被劃分為同一個Stage;
●對于寬依賴,由于Shuffle的存在,必須等到父RDD的Shuffle處理完成后,才能開始接下來的計算,所以會在此處進(jìn)行Stage的切分。


●在Spark中,DAG生成的流程關(guān)鍵在于回溯,在程序提交后,高層調(diào)度器將所有的RDD看成是一個Stage,然后對此Stage進(jìn)行從后往前的回溯,遇到Shuffle就斷開,遇到窄依賴,則歸并到同一個Stage。等到所有的步驟回溯完成,便生成一個DAG圖。
為什么要劃分Stage? --并行計算
? ? 一個復(fù)雜的業(yè)務(wù)邏輯如果有shuffle,那么就意味著前面階段產(chǎn)生結(jié)果后,才能執(zhí)行下一個階段,即下一個階段的計算要依賴上一個階段的數(shù)據(jù)。那么我們按照shuffle進(jìn)行劃分(也就是按照寬依賴就行劃分),就可以將一個DAG劃分成多個Stage/階段,在同一個Stage中,會有多個算子操作,可以形成一個pipeline流水線,流水線內(nèi)的多個平行的分區(qū)可以并行執(zhí)行。
? ? Pipeline:HDFS----textRDD----splitRDD-----tupleRDD
如何劃分DAG的stage
? ? 對于窄依賴,partition的轉(zhuǎn)換處理在stage中完成計算,不劃分(將窄依賴盡量放在在同一個stage中,可以實現(xiàn)流水線計算)
? ? 對于寬依賴,由于有shuffle的存在,只能在父RDD處理完成后,才能開始接下來的計算,也就是說需要要劃分stage
總結(jié)
Spark會根據(jù)shuffle/寬依賴使用回溯算法來對DAG進(jìn)行Stage劃分,從后往前,遇到寬依賴就斷開,遇到窄依賴就把當(dāng)前的RDD加入到當(dāng)前的stage/階段中
