spark_RDD依赖关系

307 阅读2分钟

1. 查看血缘关系

RDD只支持粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列Lineage(血统)记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。

查看血缘关系:

通过toDebugString方法查看血缘关系

(2) ParallelCollectionRDD[0] at makeRDD at Spark04_TestLineage.scala:20 []
List()
------------------------------
(2) MapPartitionsRDD[1] at flatMap at Spark04_TestLineage.scala:28 []
 |  ParallelCollectionRDD[0] at makeRDD at Spark04_TestLineage.scala:20 []
List(org.apache.spark.OneToOneDependency@4f449e8f)
------------------------------
(2) MapPartitionsRDD[2] at map at Spark04_TestLineage.scala:33 []
 |  MapPartitionsRDD[1] at flatMap at Spark04_TestLineage.scala:28 []
 |  ParallelCollectionRDD[0] at makeRDD at Spark04_TestLineage.scala:20 []
List(org.apache.spark.OneToOneDependency@3044e9c7)
------------------------------
(2) ShuffledRDD[3] at reduceByKey at Spark04_TestLineage.scala:38 []
 +-(2) MapPartitionsRDD[2] at map at Spark04_TestLineage.scala:33 []
    |  MapPartitionsRDD[1] at flatMap at Spark04_TestLineage.scala:28 []
    |  ParallelCollectionRDD[0] at makeRDD at Spark04_TestLineage.scala:20 []
List(org.apache.spark.ShuffleDependency@2098d37d)
------------------------------

注意:圆括号中的数字表示RDD的并行度,也就是有几个分区

2. 查看依赖关系

注意:要想理解RDDS是如何工作的,最重要的就是理解Transformations。

RDD 之间的关系可以从两个维度来理解: 一个是 RDD 是从哪些 RDD 转换而来, 也就是 RDD 的 parent RDD(s)是什么; 另一个就是 RDD 依赖于 parent RDD(s)的哪些 Partition(s). 这种关系就是 RDD 之间的依赖.

RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。

3. 窄依赖

窄依赖表示每一个父RDD的Partition最多被子RDD的一个Partition使用,窄依赖我们形象的比喻为独生子女。

4. 宽依赖

宽依赖表示同一个父RDD的Partition被多个子RDD的Partition依赖会引起Shuffle,总结:宽依赖我们形象的比喻为超生。 具有宽依赖的 transformations 包括: sort, reduceByKey, groupByKey, join, 和调用rePartition函数的任何操作.

宽依赖对 Spark 去评估一个 transformations 有更加重要的影响, 比如对性能的影响.