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