開門見山,本文就針對乙個點,談談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之間的依賴關係分類...