https://www.jianshu.com/p/736a4e628f0f
1.1 窄依賴
窄依賴是指1個父RDD分區對應1個子RDD的分區。
換句話說,一個父RDD的分區對應於一個子RDD的分區,或者多個父RDD的分區對應於一個子RDD的分區。所以窄依賴又可以分為兩種情況:
- 1個子RDD的分區對應於1個父RDD的分區,比如map,filter,union等算子
- 1個子RDD的分區對應於N個父RDD的分區,比如co-partioned join
1.2 寬依賴
寬依賴是指1個父RDD分區對應多個子RDD分區。
寬依賴有分為兩種情況
- 1個父RDD對應非全部多個子RDD分區,比如groupByKey,reduceByKey,sortByKey
-
1個父RDD對應所有子RDD分區,比如未經協同划分的join
2. 為什么Spark將依賴分為窄依賴和寬依賴
2.1 窄依賴(narrow dependency)
可以支持在同一個集群Executor上,以pipeline管道形式順序執行多條命令,例如在執行了map后,緊接着執行filter。分區內的計算收斂,不需要依賴所有分區的數據,可以並行地在不同節點進行計算。所以它的失敗恢復也更有效,因為它只需要重新計算丟失的parent partition即可
2.2 寬依賴(shuffle dependency)
則需要所有的父分區都是可用的,必須等RDD的parent partition數據全部ready之后才能開始計算,可能還需要調用類似MapReduce之類的操作進行跨節點傳遞。從失敗恢復的角度看,shuffle dependency牽涉RDD各級的多個parent partition。