0%

RDD依赖关系

RDD依赖关系

在执行RDD的过程中如果某一个RDD出现问题,且RDD本身并不存储数据,那么就需要从数据源的位置重新开始执行,那么出现问题的RDD如何找到它的数据源在哪里?RDD在创建的时候会保存一系列的RDD依赖关系,根据这些依赖关系可以重新找到数据源来进行重新计算,两个相邻RDD之间的关系就是依赖关系,而将一系列依赖关系串联起来就是血缘关系

可以使用dependencies方法来查看RDD的依赖关系

1
2
3
4
5
rdd.dependencies

------------
List(org.apache.spark.OneToOneDependency@2133661d)
List(org.apache.spark.ShuffleDependency@1a3071d8)

也可以使用toDebugString方法来查看该RDD的完整血缘关系

1
2
3
4
5
6
7
8
9
rdd.toDebugString

-----------
(1) ShuffledRDD[4] at reduceByKey at TestDependency.scala:44 []
+-(1) MapPartitionsRDD[3] at map at TestDependency.scala:36 []
| MapPartitionsRDD[2] at flatMap at TestDependency.scala:28 []
| /Users/zhanghe/Desktop/user/myself/GitProject/spark/target/classes/wordcount/wordcount.txt MapPartitionsRDD[1] at textFile at TestDependency.scala:20 []
| /Users/zhanghe/Desktop/user/myself/GitProject/spark/target/classes/wordcount/wordcount.txt HadoopRDD[0] at textFile at TestDependency.scala:20 []

可以发现出现了两种不同的依赖OneToOneDependency和ShuffleDependency,而OneToOneDependency是继承于NarrowDependency的,这两种依赖表示的含义是不一样的

  • OneToOneDependency表示两个分区之间的映射是一对一的,上游的一个分区数据只会被一个下游的分区使用
  • 而ShuffleDependency依赖不同,它表示进行了Shuffle操作,分区数据会被打乱,从而同一个上游分区数据可能会被下游的多个分区使用