RDD会把之前的依赖关系记录下来,防止在RDD的某一个阶段执行过程中出现问题后,部分分区数据丢失后,无法恢复数据,这是RDD另一个弹性属性,在数据出现问题,重新恢复数据
每一个RDD会把它之前的血缘关系记录下来,可以用 rdd.toDebugString 来获取他所有的血缘关系
val fileRDD: RDD[String] = sc.makeRDD(List("scala","Spark","Spark","scala","hello"))
println(fileRDD.toDebugString)
println("----------------------")
val wordRDD: RDD[String] = fileRDD.flatMap(_.split(" "))
println(wordRDD.toDebugString)
println("----------------------")
val mapRDD: RDD[(String, Int)] = wordRDD.map((_,1))
println(mapRDD.toDebugString)
println("----------------------")
val resultRDD: RDD[(String, Int)] = mapRDD.reduceByKey(_+_)
println(resultRDD.toDebugString)
resultRDD.collect()
输出结果如下:
(4) ParallelCollectionRDD[0] at makeRDD at DependesesTest.scala:12 []
----------------------
(4) MapPartitionsRDD[1] at flatMap at DependesesTest.scala:15 []
| ParallelCollectionRDD[0] at makeRDD at DependesesTest.scala:12 []
----------------------

本文详细介绍了Spark中的RDD如何记录依赖关系,从`fileRDD`创建到`resultRDD`的转换过程中,展示了窄依赖(一对一依赖)和宽依赖(ShuffleDependency)的区别。通过`dependencies`属性揭示了每个RDD的前世今生,帮助理解数据处理流程的弹性与效率。
最低0.47元/天 解锁文章
1009

被折叠的 条评论
为什么被折叠?



