Spark_5 RDD依賴關係

RDDs 通過操作算子進行轉換,轉換得到的新 RDD 包含了從其他 RDDs 衍生所必需的信息,RDDs 之間維護着這種血緣關係,也稱之爲依賴。依賴包括兩種,一種是窄依賴,RDDs 之間分區是一一對應的,另一種是寬依賴,下游 RDD 的每個分區與上游RDD(也稱之爲父 RDD)的每個分區都有關,是多對多的關係。
在這裏插入圖片描述

Lineage

RDD 只支持粗粒度轉換,即在大量記錄上執行的單個操作。將創建 RDD 的一系列
Lineage(血統)記錄下來,以便恢復丟失的分區。 RDD 的 Lineage 會記錄 RDD 的元數據信息和轉換行爲,當該 RDD 的部分分區數據丟失時,它可以根據這些信息來重新運算和恢復丟失的數據分區。

窄依賴與寬依賴

窄依賴

一個父RDD的partition只能被子RDD的partition使用一次
類似於獨生子女。
一父對一子,屬於窄依賴;多父對一子,也屬於窄依賴;
多父對一子,屬於寬依賴;多父對多子,也屬於寬依賴。
所以join操作不一定是寬依賴,亦可以是窄依賴

寬依賴

一個父RDD的partition被子RDD的partition使用不止一次
類似於超生

寬依賴與窄依賴在應用上的區別

  1. 數據丟失時:窄依賴:在數據丟失時,只需要修復與丟失數據的分區有血緣的父RDD的分區,這種情況,問題不大;寬依賴:一個分區丟了,之前的所有分區都需要重新計算;
  2. 落盤與否:窄依賴會直接以pipeline走到一個stage的底,一個pipeiline的數據是不會落盤的;而寬依賴屬於shuffle算子,是會落到磁盤的;

DAG

DAG(Directed Acyclic Graph)叫做有向無環圖,原始的 RDD 通過一系列的轉換就就形成了 DAG,根據 RDD 之間的依賴關係的不同將 DAG 劃分成不同的 Stage,對於窄依賴, partition 的轉換處理在 Stage 中完成計算。對於寬依賴,由於有 Shuffle 的存在,只能在 parent RDD 處理完成後,才能開始接下來的計算,因此寬依賴是劃分 Stage 的依據。

任務劃分

RDD 任務切分中間分爲: Application、 Job、 Stage 和 Task

  1. Application:初始化一個 SparkContext 即生成一個 Application
  2. Job:一個 Action 算子就會生成一個 Job
  3. Stage: 根據 RDD 之間的依賴關係的不同將 Job 劃分成不同的 Stage, 遇到一個寬依賴則劃分一個 Stage。
  4. Task: Stage 是一個TaskSet,將 Stage 劃分的結果發送到不同的 Executor 執行即爲一個Task。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章