Spark中RDD的高效與DAG圖有着莫大的關系,
在DAG調度中需要對計算過程划分Stage,
而划分的依據就是就是RDD之間的依賴關系。
針對不同的轉換函數,RDD之間的依賴關系分為窄依賴(narrow dependency)
和寬依賴(Wide Depencency,也稱為Shuffle Depencency)。
窄依賴:
指父RDD的每個分區只被子RDD的一個分區所使用,子RDD分區通常對應常數個父RDD分區(O(1),與數據規模無關)
寬依賴:
是指父RDD的每個分區都可能被多個子RDD分區所使用,子RDD分區通常對應所有的父RDD分區(O(n),與數據規模有關)
相比於依賴,窄依賴對優化很有利,主要基於以下兩點:
1、依賴往往對應着Shuffle操作,需要在運行過程中將同一個父RDD的分區傳入到不同的子RDD分區中,
中間可能涉及多個節點之間的數據傳輸;而窄依賴的每個父RDD的分區只會傳入到一個子RDD分區中,通常可以在一個節點內完成轉換
2、當RDD分區丟失時(某個節點故障),Spark會對數據進行重算
3、對於窄依賴,由於父RDD的一個分區只對應一個子RDD分區,這樣只需要重算和子RDD分區對應的父RDD分區即可,所以這個重算對數據的利用率是100%的
4、對於依賴,重算的父RDD分區對應多個子RDD分區的,這樣實際上父RDD中只有一部分的數據是被用於恢復這個丟失的子RDD分區的,另一部分對應子RDD的其他未丟失分區,這就造成了多余的計算;更一般的,寬依賴中子RDD分區通常來自多個父RDD分區,極端情況下,所有的父RDD分區都要進行重新計算。
原文:https://blog.csdn.net/daerzei/article/details/81512412