首頁技術文章正文

Spark RDD的兩種依賴關系?

更新時間:2021-01-05 來源:黑馬程序員 瀏覽量:

1577370495235_學IT就到黑馬程序員.gif


在Spark中,不同的RDD之間具有依賴的關系。RDD與它所依賴的RDD的依賴關系有兩種類型,分別是窄依賴(narrow dependency)和寬依賴(wide dependency)。

窄依賴是指父RDD的每一個分區(qū)最多被一個子RDD的分區(qū)使用,即OneToOneDependencies。窄依賴的表現(xiàn)一般分為兩類,第一類表現(xiàn)為一個父RDD的分區(qū)對應于一個子RDD的分區(qū);第二類表現(xiàn)為多個父RDD的分區(qū)對應于一個子RDD的分區(qū)。也就是說,一個父RDD的一個分區(qū)不可能對應一個子RDD的多個分區(qū)。為了便于理解,我們通常把窄依賴形象的比喻為獨生子女。當RDD執(zhí)行map、filter及union和join操作時,都會產生窄依賴,如圖1所示。

1609840863293_1.jpg

圖1 Narrow Dependencies窄依賴

從圖1可以看出,RDD做map、filter和union算子操作時,是屬于窄依賴的第一類表現(xiàn);而RDD做join算子操作(對輸入進行協(xié)同劃分)時,是屬于窄依賴表現(xiàn)的第二類。這里的輸入協(xié)同劃分是指多個父RDD的某一個分區(qū)的所有Key,被劃分到子RDD的同一分區(qū),而不是指同一個父RDD的某一個分區(qū),被劃分到子RDD的兩個分區(qū)中。當子RDD做算子操作,因為某個分區(qū)操作失敗導致數據丟失時,只需要重新對父RDD中對應的分區(qū)(與子RDD相對應的分區(qū))做算子操作即可恢復數據。

寬依賴是指子RDD的每一個分區(qū)都會使用所有父RDD的所有分區(qū)或多個分區(qū),即OneToManyDependecies。為了便于理解,我們通常把寬依賴形象的比喻為超生。當RDD做groupByKey和join操作時,會產生寬依賴,如圖2所示。

1609840332126_2.jpg

圖2 Wide Dependencies寬依賴

從圖2可以看出,父RDD做groupByKey和join(輸入未協(xié)同劃分)算子操作時,子RDD的每一個分區(qū)都會依賴于所有父RDD的所有分區(qū)。當子RDD做算子操作,因為某個分區(qū)操作失敗導致數據丟失時,則需要重新對父RDD中的所有分區(qū)進行算子操作才能恢復數據。

需要注意的是,join算子操作既可以屬于窄依賴,也可以屬于寬依賴。當join算子操作后,分區(qū)數量沒有變化則為窄依賴(如join with inputs co-partitioned,輸入協(xié)同劃分);當join算子操作后,分區(qū)數量發(fā)生變化則為寬依賴(如join with inputs not co-partitioned,輸入非協(xié)同劃分)。



猜你喜歡:
不同系統(tǒng)如何加載數據創(chuàng)建RDD?

RDD為什么要進行數據持久化?它的操作方法有哪些?

Spark RDD是什么?RDD特征介紹

黑馬程序員大數據培訓課程 

分享到:
在線咨詢 我要報名
和我們在線交談!