Spark 寬依賴和窄依賴

2021-08-13 03:03:47 字數 1847 閱讀 5599

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

寬依賴和窄依賴關係圖:

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完全比mp有優勢了。這之前,在一些場景下spark還是比不過mp的。(這個地方會寫乙個專門的文章來闡述變化過程)。

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

1.寬依賴往往對應著shuffle操作,需要在執行過程中將同乙個父rdd的分割槽傳入到不同的子rdd分割槽中,中間可能涉及到多個節點之間的資料傳輸;而窄依賴的每個父rdd的分割槽只會傳入到乙個子rdd分割槽中,通常可以在乙個節點內就可以完成了。

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

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

區分這兩種依賴很有用。首先,窄依賴允許在乙個集群節點上以流水線的方式(pipeline)計算所有父分割槽。例如,逐個元素地執行map、然後filter操作;而寬依賴則需要首先計算好所有父分割槽資料,然後在節點之間進行shuffle,這與mapreduce類似。第二,窄依賴能夠更有效地進行失效節點的恢復,即只需重新計算丟失rdd分割槽的父分割槽,而且不同節點之間可以平行計算;而對於乙個寬依賴關係的lineage圖,單個節點失效可能導致這個rdd的所有祖先丟失部分分割槽,因而需要整體重新計算。
窄依賴中每個子rdd可能對應多個父rdd,當子rdd丟失時會導致多個父rdd進行重新計算,所以窄依賴不如寬依賴有優勢。

而實際上應該深入到分割槽級別去看待這個問題,而且重算的效用也不在於算的多少,而在於有多少是冗餘的計算。窄依賴中需要重算的都是必須的,所以重算不冗餘

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

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

Spark 寬依賴和窄依賴

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

spark 寬依賴和窄依賴

一 窄依賴 narrow dependency,即乙個rdd,對它的父rdd,只有簡單的一對一的依賴關係。也就是說,rdd的每個partition 僅僅依賴於父rdd中的乙個partition,父 rdd和子rdd的partition之間的對應關係,是一對一的!這種情況下,是簡單的rdd之間的依賴關...