Spark 中的寬依賴和窄依賴

2021-07-25 03:53:14 字數 1299 閱讀 6256

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

寬依賴和窄依賴如下圖所示:

相比於寬依賴,窄依賴對優化很有利 ,主要基於以下兩點:

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

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

對於窄依賴,由於父rdd的乙個分割槽只對應乙個子rdd分割槽,這樣只需要重算和子rdd分割槽對應的父rdd分割槽即可,所以這個重算對資料的利用率是100%的;

對於寬依賴,重算的父rdd分割槽對應多個子rdd分割槽,這樣實際上父rdd 中只有一部分的資料是被用於恢復這個丟失的子rdd分割槽的,另一部分對應子rdd的其它未丟失分割槽,這就造成了多餘的計算;更一般的,寬依賴中子rdd分割槽通常來自多個父rdd分割槽,極端情況下,所有的父rdd分割槽都要進行重新計算。

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

以下是文章 rdd:基於記憶體的集群計算容錯抽象 中對寬依賴和窄依賴的對比。

區分這兩種依賴很有用。首先,窄依賴允許在乙個集群節點上以流水線的方式(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 寬依賴和窄依賴

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

Spark 寬依賴和窄依賴

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