RDD 依賴關係

RDD依賴關係有兩種:窄依賴(Narrow Dependency)、寬依賴(ShuffleDependency)。窄依賴表示每個父RDD中的Partition最多被子RDD的一個Partition使用;寬依賴表示一個父RDD的Partition都會被多個子RDD的Partition所使用。

窄依賴

RDD的窄依賴(Narrow Dependency)是RDD中最常見的依賴關係,用來表示每一個父RDD中的Partition最多被子RDD的一個Partition所使用。

窄依賴分為兩類:

  • 第一類是一對一的依賴關係,在Spark中用OneToOneDependency來表示父RDD與子RDD的依賴關係是一對一的依賴關係,如map、filter、join with inouts co-partitioned;

OneToOneDependency源碼,位於org.apache.spark.OneToOneDependency

OneToOneDependency的重寫getParents方法,子RDD在使用getParents方法時,返回的是父RDD的partitionId。子RDD僅僅依賴父RDD中相同partitionId的Partition。

  • 第二類是範圍依賴關係,在Spark中用RangeDependency表示,表示父RDD與子RDD的一對一範圍內依賴關係,如union。

RangeDependency源碼,位於org.apache.spark.RangeDependency

RangeDependency與OneToOneDependency最大的區別是實現方法中出現了outStart、length、inStart,子RDD在通過getParents方法查詢對應的Partition是,會根據這個partitionId減去插入時的開始ID,在加上在父RDD中的位置。就是將父RDD中的Partition,根據partitionId的 順序依次插入到子RDD中。

寬依賴

RDD的寬依賴(Shuffle Dependency)是一種會導致計算式產生Shuffle操作的RDD操作,用來表示一個父RDD的Partition都會被多個子RDD的Partition使用。

ShuffleDependency源碼,位於org.apache.spark.ShuffleDependency

newShuffleId產生新的ShuffleId,表明寬依賴過程需要設計Shuffle操作,後續的代碼表示寬依賴進行shuffle操作時需要向shuffleManager註冊信息。

根據代碼,ShuffleDependency定義瞭如下屬性:

  • _rdd:泛型要求必須是Produce2[K, V]及其子類的RDD。
  • partitioner:分區計算器Partitioner。
  • serializer:SparkEnv中創建的serializer。
  • keyOrdering:按照K進行排序的scala.math.Ordering的實現類。
  • aggregator:對map任務的輸出數據進行聚合的聚合器。
  • mapSideCombine:是否在map端進行合併,默認為false。
  • keyClassName:K的類名。
  • valueClassName:V的類名。
  • combinerClassName:結合器C的類名。
  • shuffleId:當前ShuffleDependency的身份標識。
  • shuffleHandle:當前ShuffleDependency的處理器。

此外,ShuffleDependency還重寫了父類的Dependency的rdd方法,其實現將_rdd轉化為RDD[Produce2[K, V]]後返回。


分享到:


相關文章: