Spark RDD的窄依賴和寬依賴

目錄

前言

一、窄依賴

二、寬依賴

三、使用WC演示窄依賴、寬依賴

四、窄依賴中的join

五、總結


前言

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爲寬依賴。

在業務中,爲了方便容錯回溯,儘量少使用寬依賴。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章