更新時間:2020年12月29日17時08分 來源:傳智教育 瀏覽次數(shù):
DAG(Directed Acyclic Graph)叫做有向無環(huán)圖,Spark中的RDD通過一系列的轉(zhuǎn)換算子操作和行動算子操作形成了一個DAG。DAG是一種非常重要的圖論數(shù)據(jù)結(jié)構(gòu)。如果一個有向圖無法從任意頂點出發(fā)經(jīng)過若干條邊回到該點,則這個圖就是有向無環(huán)圖,具體如圖1所示。
圖1 DAG有向無環(huán)圖
從圖1可以看出,4→6→1→2是一條路徑,4→6→5也是一條路徑,并且圖中不存在從頂點經(jīng)過若干條邊后能回到該點。在Spark中,有向無環(huán)圖的連貫關(guān)系被用來表達RDD之間的依賴關(guān)系。其中,頂點表示RDD及產(chǎn)生該RDD的操作算子,有方向的邊表示算子之間的相互轉(zhuǎn)化。
根據(jù)RDD之間依賴關(guān)系的不同可以將DAG劃分成不同的Stage(調(diào)度階段)。對于窄依賴來說,RDD分區(qū)的轉(zhuǎn)換處理是在一個線程里完成,所以窄依賴會被Spark劃分到同一個Stage中;而對于寬依賴來說,由于有Shuffle的存在,所以只能在父RDD處理完成后,下一個Stage才能開始接下來的計算,因此寬依賴是劃分Stage的依據(jù),當RDD進行轉(zhuǎn)換操作,遇到寬依賴類型的轉(zhuǎn)換操作時,就劃為一個Stage。Stage的具體劃分如圖2所示。
圖2 Stage的劃分
在圖2中,創(chuàng)建了三個RDD的實例A、C以及E。當RDD的實例A做groupByKey轉(zhuǎn)換操作生成B時,由于groupByKey轉(zhuǎn)換操作屬于寬依賴類型,所以就把實例A劃分為一個Stage,如Stage1;當實例C做map轉(zhuǎn)換操作生成D, D與實例E做union轉(zhuǎn)換操作生成F,由于map和union轉(zhuǎn)換操作都屬于窄依賴類型,因此不進行Stage的劃分,而是將C、D、E、F加入到同一個Stage中;當F與B進行join轉(zhuǎn)換操作時,由于這時的join操作是非協(xié)同劃分,所以屬于寬依賴,因此會劃分為一個Stage,如Stage2;剩下的B和G被劃分為一個Stage,如Stage3。