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]]後返回。
閱讀更多 石頭渣渣 的文章