目錄
前言
RDD的五大特性之一就是RDD之間有依賴關係,描述了RDD如何從源頭計算過來的。
這樣可以做到容錯,如果某一個RDD分區出現錯誤,可以根據依賴關係重新計算相關的分區,而不需要全部重新計算。
如果鏈路關係太長,可以checkpoint下來
本文主要介紹下窄依賴和寬依賴
一、窄依賴
一個父RDD的分區至多被子RDD的某個分區使用一次
1)一個父RDD和一個子RDD的分區是唯一映射的 例如map filter
2)多個父RDD和一個子RDD的分區是唯一映射的 例如union
3)特殊的join 沒有shuffle
二、寬依賴
一個父RDD的分區會被子RDD的分區使用多次
例如join、groupByKey、reduceByKey、...ByKey 有shuffle、產生新的stage
三、使用WC演示窄依賴、寬依賴
代碼
val lines = sc.parallelize(Array("hello,spark", "hello,flink", "hello,hadoop"))
val words = lines.flatMap(_.split(","))
val pair = words.map((_, 1))
val wc = pair.reduceByKey(_ + _)
wc.collect()
DAG圖
四、窄依賴中的join
其實寬窄依賴通過以上的例子已經瞭解的差不多了。
下面來介紹其中的一個特例:窄依賴中的join
join的倆哥們是寬依賴(存在shuffle),分區數相同,join後的分區數也相同,則爲窄依賴
val rdd1 = sc.parallelize(Array("zs", "ls", "ww"), 2).map((_, 1)).reduceByKey(_ + _)
val rdd2 = sc.parallelize(Array("hz", "sh", "bj","gz"), 2).map((_, 1)).reduceByKey(_ + _)
rdd1.join(rdd2,2).collect()
五、總結
窄依賴:父類只有一個孩子,不存在shuffle,例如map、filter
寬依賴:父類有多個孩子,存在shuffle,例如groupByKey、reduceByKey
需要注意的是:join的倆哥們如果是寬依賴(存在shuffle),並且分區數量相同,join後的結果也相同,則爲窄依賴,其他情況的join爲寬依賴。
在業務中,爲了方便容錯回溯,儘量少使用寬依賴。