上1篇我们介绍了代表RDD组成的(Dependency、Partition、Partitioner)之1的Partition,这篇接着介绍Dependency。Partition记录的是数据split的逻辑,Dependency记录的是transformation操作进程中Partition的演变,即这个Partition从哪来到哪去的进程。
我的另外一篇博客Spark RDD中介绍了RDD的组成,及Dependency的分类和缘由,这里不再累述,先看下Dependency的定义:
Dependency是抽象类,有1个抽象方法rdd,Dependency其实就是父RDD的包装,其主要子类实现有两大类:
Dependency分为两大类,宽依赖和窄依赖,窄依赖有两个主要实现。
以Wordcount为例
val wordcount = sc.parallelize(List("a c", "a b")) wordcount.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect()
通过web UI查看DAG,以下:
可以看出,其根据shuffle的位置划分为两个stage,stage0和stage1
调用toDebugString查看各RDD之间关系
最后,总结出Wordcount中RDD及其对应的Dependency以下,其中方形代表RDD,圆角矩形代表Partition(3个圆角矩形是为了作图方便,不代表其具体有3个Partition),文本框内第1行动代码片断,第2行是对应的RDD,第3行动RDD的Dependency类型
Dependency是RDD的重要组成,分为宽依赖和窄依赖两大类,实质就是其父RDD的包装,由Dependency组成的关系构成了lineage的物理结构,也是DAG的物理结构,宽依赖(即shuffle操作)也是stage划分的根据,窄依赖可以履行流水线(pipeline)操作,效力高。