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