什么是DAG
在Spark里每一個(gè)操作生成一個(gè)RDD,RDD之間連一條邊,最后這些RDD和他們之間的邊組成一個(gè)有向無(wú)環(huán)圖,這個(gè)就是DAG誊册。
Spark 為什么要構(gòu)建DAG?
Spark會(huì)根據(jù)寬依賴窄依賴來(lái)劃分具體的Stage,而依賴有2個(gè)作用:
- 用來(lái)解決數(shù)據(jù)容錯(cuò)的高效性暖璧;
- 其二用來(lái)劃分stage案怯。
RDD的依賴關(guān)系分為兩種:窄依賴(Narrow Dependencies)與寬依賴(Wide Dependencies,源碼中稱為Shuffle Dependencies)
-
窄依賴
每個(gè)父RDD的一個(gè)Partition最多被子RDD的一個(gè)Partition所使用(1:1 或 n:1)漆撞。例如map殴泰、filter、union等操作都會(huì)產(chǎn)生窄依賴浮驳;
子RDD分區(qū)通常對(duì)應(yīng)常數(shù)個(gè)父RDD分區(qū)(O(1)悍汛,與數(shù)據(jù)規(guī)模無(wú)關(guān))。
-
寬依賴
一個(gè)父RDD的Partition會(huì)被多個(gè)子RDD的Partition所使用至会,例如groupByKey离咐、reduceByKey、sortByKey等操作都會(huì)產(chǎn)生寬依賴;(1:m 或 n:m)
子RDD分區(qū)通常對(duì)應(yīng)所有的父RDD分區(qū)(O(n)宵蛀,與數(shù)據(jù)規(guī)模有關(guān))
DAG的生成
原始的RDD通過(guò)一系列的轉(zhuǎn)換就形成了DAG昆著,有了計(jì)算的DAG圖,Spark內(nèi)核下一步的任務(wù)就是根據(jù)DAG圖將計(jì)算劃分成任務(wù)集术陶,也就是Stage凑懂,這樣可以將任務(wù)提交到計(jì)算節(jié)點(diǎn)進(jìn)行真正的計(jì)算。Spark計(jì)算的中間結(jié)果默認(rèn)是保存在內(nèi)存中的梧宫,Spark在劃分Stage的時(shí)候會(huì)充分考慮在分布式計(jì)算中可流水線計(jì)算(pipeline)的部分來(lái)提高計(jì)算的效率接谨,而在這個(gè)過(guò)程中Spark根據(jù)RDD之間依賴關(guān)系的不同將DAG劃分成不同的Stage(調(diào)度階段)。對(duì)于窄依賴
塘匣,partition的轉(zhuǎn)換處理在一個(gè)Stage中完成計(jì)算脓豪。對(duì)于寬依賴
,由于有Shuffle的存在忌卤,只能在parent RDD處理完成后扫夜,才能開(kāi)始接下來(lái)的計(jì)算,因此寬依賴是劃分Stage的依據(jù)
驰徊。
Spark Works By DAG
Spark 執(zhí)行時(shí)有下面所列的流程:
用戶代碼定義RDD的有向無(wú)環(huán)圖
RDD上的操作會(huì)創(chuàng)建新的RDD笤闯,并引用它們的父節(jié)點(diǎn),這樣就創(chuàng)建了一個(gè)圖辣垒。行動(dòng)操作把有向無(wú)環(huán)圖強(qiáng)制轉(zhuǎn)譯為執(zhí)行計(jì)劃
當(dāng)調(diào)用RDD的一個(gè)行動(dòng)操作時(shí)望侈,這個(gè)RDD就必須被計(jì)算出來(lái)印蔬。這也要求計(jì)算出該RDD的父節(jié)點(diǎn)勋桶。Spark調(diào)度器提交一個(gè)作業(yè)來(lái)計(jì)算出所有必要的RDD。這個(gè)作業(yè)會(huì)包含一個(gè)或多個(gè)步驟侥猬,每個(gè)步驟其實(shí)也就是一波并行執(zhí)行的計(jì)算任務(wù)例驹。一個(gè)步驟對(duì)應(yīng)有向五環(huán)圖中的一個(gè)或多個(gè)RDD,一個(gè)步驟對(duì)應(yīng)多個(gè)RDD是因?yàn)榘l(fā)生了流水線執(zhí)行退唠。任務(wù)于集群中調(diào)度并執(zhí)行
步驟是按順序處理的鹃锈,任務(wù)則獨(dú)立的啟動(dòng)來(lái)計(jì)算出RDD的一部分。一旦作業(yè)的最后一個(gè)步驟結(jié)束瞧预,一個(gè)行動(dòng)操作也就執(zhí)行完了屎债。
注:在一個(gè)給定的Spark應(yīng)用中,由于需要?jiǎng)?chuàng)建一系列新的RDD垢油,因此上述階段會(huì)連續(xù)發(fā)生很多次