聊聊Spark中的寬依賴和窄依賴

2021-08-21 07:19:04 字數 1142 閱讀 3040

開門見山,本文就針對乙個點,談談spark中的寬依賴和窄依賴,這是spark計算引擎劃分stage的根源所在,遇到寬依賴,則劃分為多個stage,針對每個stage,提交乙個taskset:

上圖:一張網上的圖:

基於此圖,分析下這裡為什麼前面的流程都是窄依賴,而後面的卻是寬依賴:

我們仔細看看,map和filter運算元中,對於父rdd來說,乙個分區內的資料,有且僅有乙個子rdd的分割槽來消費該資料。

同樣,union運算元也是同樣的:

所以,我們判斷窄依賴的依據就是:父類分區內的資料,會被子類rdd中的指定的唯一乙個分割槽所消費:

這是很重要的:

面試的時候,面試官問到了乙個問題,如果父類rdd有很多的分割槽,而子類rdd只有乙個分割槽,我們可以使用repartition或者coalesce運算元來實現該效果,請問,這種實現是寬依賴?還是窄依賴?

如果從網上流傳的一種觀點:子rdd乙個partition內的資料依賴於父類rdd的所有分割槽,則為寬依賴,這種判斷明顯是錯誤的:

別笑,網上的確有這種說法,我差點栽了跟頭,這種解釋實質上是錯誤的,因為如果我們的reducetask只有乙個的時候,只有乙個分割槽,這個分區內的資料,肯定依賴於所有的父類rdd:

毫無疑問,這是個窄依賴:

相對之下,什麼是寬依賴呢?

寬依賴,指的是父類乙個分區內的資料,會被子rdd內的多個分割槽消費,需要自行判斷分割槽,來實現資料傳送的效果:

總結一下:

窄依賴:父rdd中,每個分區內的資料,都只會被子rdd中特定的分割槽所消費,為窄依賴:

寬依賴:父rdd中,分區內的資料,會被子rdd內多個分割槽消費,則為寬依賴:

這裡,還存在乙個可能被挑刺的地方,比如說父類每個分區內都只有乙個資料,毫無疑問,這些資料都會被唯一地指定到子類的某個分區內,這是窄依賴?還是寬依賴?

這時候,可以從另外乙個角度來看問題:

每個分區內的資料,是否能夠指定自己在子類rdd中的分割槽?

如果不能,那就是寬依賴:如果父rdd和子rdd分割槽數目一致,那基本就是窄依賴了:

總之,還是要把握住根本之處,就是父rdd中分區內的資料,是否在子類rdd中也完全處於乙個分割槽,如果是,窄依賴,如果不是,寬依賴。

寬依賴和窄依賴 Spark 寬依賴和窄依賴

1.前言 上一節spark dag概述 spark中rdd的高效與dag圖有著莫大的關係,在dag排程中需要對計算過程劃分stage,暴力的理解就是stage的劃分是按照有沒有涉及到shuffle來劃分的,沒涉及的shuffle的都劃分在乙個stage裡面,這種劃分依據就是rdd之間的依賴關係。針對...

Spark 中的寬依賴和窄依賴

spark中rdd的高效與dag圖有著莫大的關係,在dag排程中需要對計算過程劃分stage,而劃分依據就是rdd之間的依賴關係。針對不同的轉換函式,rdd之間的依賴關係分類窄依賴 narrow dependency 和寬依賴 wide dependency,也稱 shuffle dependenc...

Spark 寬依賴和窄依賴

spark中rdd的高效與dag圖有著莫大的關係,在dag排程中需要對計算過程劃分stage,暴力的理解就是stage的劃分是按照有沒有涉及到shuffle來劃分的,沒涉及的shuffle的都劃分在乙個stage裡面,這種劃分依據就是rdd之間的依賴關係。針對不同的轉換函式,rdd之間的依賴關係分類...