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

2021-10-19 23:48:17 字數 2526 閱讀 6141

1.前言

《上一節spark dag概述》spark中rdd的高效與dag圖有著莫大的關係,在dag排程中需要對計算過程劃分stage,

暴力的理解就是stage的劃分是按照有沒有涉及到shuffle來劃分的,沒涉及的shuffle的都劃分在乙個stage裡面,

這種劃分依據就是rdd之間的依賴關係。針對不同的轉換函式,rdd之間的依賴關係分類窄依賴(narrow dependency)

和寬依賴(wide dependency, 也稱 shuffle dependency)

2.定義

1.窄依賴是指父rdd的每個分割槽只被子rdd的乙個分割槽所使用,子rdd分割槽通常對應常數個父rdd分割槽(o(1),與資料規模無關)

2.相應的,寬依賴是指父rdd的每個分割槽都可能被多個子rdd分割槽所使用,子rdd分割槽通常對應所有的父rdd分割槽(o(n),與資料規模有關)

3.寬依賴和窄依賴關係圖:

3.為什麼要有寬窄依賴?

1.前面已經說過了stage劃分的乙個很重要的原因就是有沒有涉及到shuffle,如果沒涉及到的被劃分到乙個stage裡面。

2.沒有涉及shuffle的任務直接執行就可以,這個也就是常提到的pipeline。這種面向的就是窄依賴。

√ 每個分割槽裡的資料都被載入到機器的記憶體裡,我們逐一的呼叫 map, filter, map 函式到這些分割槽裡,job 就很好的完成。

√ 更重要的是,由於資料沒有轉移到別的機器,我們避免了 network io 或者 disk io.

唯一的任務就是把 map / filter 的執行環境搬到這些機器上執行,這對現代計算機來說,overhead 幾乎可以忽略不計。

√ 這種把多個操作合併到一起,在資料上一口氣執行的方法在 spark 裡叫 pipeline

(其實 pipeline 被廣泛應用的很多領域,比如 cpu)。

這時候不同就出現了:只有 narrow transformation 才可以進行 pipleline 操作。

對於 wide transformation, rdd 轉換需要很多分割槽運算,包括資料在機器間搬動,所以失去了 pipeline 的前提。

√ 總結起來一句話:資料和算是否在一起,計算的效能是不一樣的,為了區分,就有了寬依賴和窄依賴。

3.一提到shuffle如果之前對mapreduce有過了解的人都知道,這個對分布式影響巨大,

spark也是一步步演變過來的,現在可以說spark2.x以上的shuffle可以認為和經典的mapreduce的shuffle一樣了,到現在可以

說spark完全比mr有優勢了。這之前,在一些場景下spark還是比不過mr的。(看這篇《spark 與mapreduce 資源排程方面的簡單對比》)

4.寬窄依賴如何優化?----得想想

4.窄依賴對優化的幫助

1.寬依賴往往對應著shuffle操作,需要在執行過程中將同乙個父rdd的分割槽傳入到不同的子rdd分割槽中,中間可能涉及到多個節點之間的

資料傳輸;而窄依賴的每個父rdd的分割槽只會傳入到乙個子rdd分割槽中,通常可以在乙個節點內就可以完成了。

2.當rdd分割槽丟失時(某個節點故障),spark會對資料進行重算。

1).對於窄依賴,由於父rdd的乙個分割槽只對應乙個子rdd分割槽,這樣只需要重算和子rdd分割槽對應的父rdd分割槽即可,

所以這個重算對資料的利用率是100%的;

2).對於寬依賴,重算的父rdd分割槽對應多個子rdd分割槽,這樣實際上父rdd 中只有一部分的資料是被用於恢復這個丟失的子rdd

分割槽的,另一部分對應子rdd的其它未丟失分割槽,這就造成了多餘的計算;更一般的,寬依賴中子rdd分割槽通常來自多個父rdd

分割槽,極端情況下,所有的父rdd分割槽都要進行重新計算。

3.如下圖所示,b1分割槽丟失,則需要重新計算a1,a2和a3,這就產生了冗餘計算(a1,a2,a3中對應b2的資料)

區分這兩種依賴很有用。首先,窄依賴允許在乙個集群節點上以流水線的方式(pipeline)計算所有父分割槽。

例如,逐個元素地執行map、然後filter操作;

而寬依賴則需要首先計算好所有父分割槽資料,然後在節點之間進行shuffle,這與mapreduce類似。

第二,窄依賴能夠更有效地進行失效節點的恢復,即只需重新計算丟失rdd分割槽的父分割槽,而且不同節點之間可以平行計算;

而對於乙個寬依賴關係的lineage圖,單個節點失效可能導致這個rdd的所有祖先丟失部分分割槽,因而需要整體重新計算。

窄依賴中每個子rdd可能對應多個父rdd,當子rdd丟失時會導致多個父rdd進行重新計算,所以窄依賴不如寬依賴有優勢。

而實際上應該深入到分割槽級別去看待這個問題,而且重算的效用也不在於算的多少,而在於有多少是冗餘的計算。

窄依賴中需要重算的都是必須的,所以重算不冗餘

寬依賴的函式有:groupbykey, join(父rdd不是hash-partitioned ), partitionby

Spark寬依賴 窄依賴

在spark中,rdd 彈性分布式資料集 存在依賴關係,寬依賴和窄依賴。寬依賴和窄依賴的區別是rdd之間是否存在shuffle操作。窄依賴窄依賴指父rdd的每乙個分割槽最多被乙個子rdd的分割槽所用,即乙個父rdd對應乙個子rdd或多個父rdd對應乙個子rdd 寬依賴寬依賴指子rdd的每個分割槽都依...

Spark 寬依賴和窄依賴

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

Spark 寬依賴和窄依賴

站在父rdd角度 窄依賴 一對一 站在父rdd角度 寬依賴 一對多 寬依賴和窄依賴 寬依賴 父rdd的分割槽被子rdd的多個分割槽使用 例如 groupbykey reducebykey sortbykey等操作會產生寬依賴,會產生shuffle 窄依賴 父rdd的每個分割槽都只被子rdd的乙個分割...