RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)
和宽依赖(wide dependency)
1、窄依赖
窄依赖指的是,每一个父RDD的Partition最多被子RDD的一个Partition使用
总结:窄依赖我们形象的比喻为独生子女(不引起Shuffle过程)
2、宽依赖
宽依赖指的是,多个子RDD的Partition会依赖同一个父RDD的Partition,会引起shuffle
总结:宽依赖我们形象的比喻为超生,或者说,父RDD的一个分区被多个子RDD的分区所使用。(会引起shuffle过程),类似**ByKey基本上都会引起Shuffle。
3、Lineage
RDD只支持粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列Lineage(即血统)记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
scala> val textRDD = sc.textFile("./README.md")
textRDD: org.apache.spark.rdd.RDD[String]
= ./README.md MapPartitionsRDD[1] at textFile at <console>:24
scala> val words = textRDD.flatMap(_.split(" "))
words: org.apache.spark.rdd.RDD[String]
= MapPartitionsRDD[2] at flatMap at <console>:26
scala> val mapRDD = words.map((_,1))
mapRDD: org.apache.spark.rdd.RDD[(String, Int)]
= MapPartitionsRDD[4] at map at <console>:28
scala> val resultRDD = mapRDD.reduceByKey(_+_)
resultRDD: org.apache.spark.rdd.RDD[(String, Int)]
= ShuffledRDD[5] at reduceByKey at <console>:30
scala> resultRDD.dependencies
res1: Seq[org.apache.spark.Dependency[_]]
= List(org.apache.spark.ShuffleDependency@14726e69)
scala> mapRDD.dependencies
res2: Seq[org.apache.spark.Dependency[_]]
= List(org.apache.spark.OneToOneDependency@a638f45)