RDD的依賴關係,以及造成的stage的劃分

2021-09-25 19:58:10 字數 1821 閱讀 1149

val data =

array(1

,2,3

,4,5

)  val distdata = sc.

parallelize

(data)

val resultrdd = distdata.

flatmap

(v =

>

(1 to v)).

map(v =

>

(v%2,1

)).reducebykey

(_+_)

resultrdd.todebugstring ## 檢視rdd的依賴情況

+ —處表示,這是兩個不同的stage

[2]表示有兩個分割槽

lineage: 生命線

依賴於rdd之間的依賴,後續的rdd資料是從之前的rdd中獲取

由於存在rdd的依賴,當乙個後續的rdd執行失敗的情況下(某個task執行失敗,eg:資料丟失),可以從父rdd中重新執行

rdd依賴父rdd,依賴的父rdd可以有多個;

特例:第乙個rdd是沒有父rdd的

rdd的內部是由多個partiiton構成的,所以rdd的依賴實質上就是rdd中partition的依賴關係

當前rdd中的每個分割槽的資料到下乙個rdd都對應乙個分割槽

即:乙個分割槽的資料輸出到下乙個rdd的時候還是在同乙個分割槽,也就是一對一

當前rdd中的多個分割槽的資料到下乙個rdd的時候輸出到同乙個分割槽,當前rdd的中乙個分割槽的資料到下乙個rdd的時候輸出到多個分割槽,也就是多對多

窄依賴:

子rdd中的每個分割槽的資料都來自於常數個父rdd的分割槽,而且父rdd每個分割槽的資料到子rdd的時候一定在乙個分割槽中

不存在shuffle過程,所有操作在一起進行

寬依賴:

子rdd中的每個分割槽的資料都依賴所有父rdd的所有的分割槽資料,而且父rdd的每個分割槽的資料到子rdd的時候不一定在乙個分割槽中

存在shuffle過程,需要等待上乙個rdd的所有task執行完成

注意點:

join有時候是寬依賴,有時候是窄依賴,這個要看分割槽數量會不會改變。

原本以為transformation的運算元是窄依賴,action運算元是寬依賴。

現在理解更深了一下,發現他們是兩個概念,不要混淆。

rdd在呼叫transformation型別的函式時候形成dag執行圖(rdd的依賴)

rdd在呼叫action型別函式的時候會觸發job的執行

在driver中使用dagscheduler對dag圖進行stage的劃分

從dag圖的最後一步(結果輸出的那一步)往前推,如果發現api是寬依賴(shuffledrdd), 就結束推斷,將此時構成的dag圖稱為乙個stage,然後繼續往前推斷,直到第乙個rdd

====> stage與stage之間的分割是寬依賴

主要是新增乙個知識點。

什麼情況下父rdd需要執行。

RDD的依賴關係和Spark任務中的Stage

rdd和它依賴的父rdd s 的關係有兩種不同的型別,即窄依賴 narrow dependency 和寬依賴 wide dependency 總結 窄依賴我們形象的比喻為獨生子女 總結 窄依賴我們形象的比喻為超生 dag directed acyclic graph 叫做有向無環圖,原始的 rdd通...

RDD中的依賴關係

1.有shuffle 2.父rdd的乙個分割槽會被子rdd的多個分割槽所依賴 父一對多 1.沒有shuffle 2.父rdd的乙個分割槽只會被子rdd的1個分割槽所依賴 一對一 窄依賴 spark可以對窄依賴進行優化 合併操作,形成pipeline 管道 同乙個管道中的各個操作可以由同乙個執行緒執行...

spark學習筆記 RDD的依賴關係

1.rdd的依賴關係 1.1 rdd的依賴 rdd和它依賴的父rdd的關係有兩種不同的型別,即窄依賴 narrow dependency 和寬依賴 wide dependency 1.2 窄依賴 窄依賴指的是每乙個父rdd的partition最多被子rdd的乙個partition使用 總結 窄依賴我...