RDD的窄依赖是RDD中最常见的依赖关系,用于表示每一个父RDD中的Partition最多被子RDD的1个Partition所使用,如图2-1所示,父RDD有2~3个Partition,每一个分区都只对应子RDD的1个Partition。
图2-1 窄依赖关系图
在Spark的源代码中,把窄依赖分为两类:一类是一对一的依赖关系,在Spark中用OneToOneDependency来表示,它表示父RDD与子RDD的依赖关系是一对一的依赖关系,如图2-1中所示的map、filter和join with inputs co-partitioned;第二类是范围依赖关系,在Spark中用RangeDependency表示,它表示父RDD与子RDD的依赖关系是一对一的范围内的依赖关系。如图2-1中所示的union。
接下来通过Spark关于这两种依赖关系的源代码来分析这两种依赖关系具体在Spark中的实现方式。
Spark关于依赖关系的源代码位于Dependency.scala文件中,其中关于OneToOneDepen-dency的内容如下所示。
可以看到,Spark的重写方法引入了参数partitionId,而在具体的方法中也使用了这个参数,这表明子RDD在通过getParents方法时,查询的是相同partitionId的内容,也就是说子RDD仅仅依赖父RDD中相同partitionID的Partition。
而Spark中关于窄依赖还有第二种依赖关系,即RangeDependency,Spark源代码中关于它的内容如下所示。
(www.xing528.com)
从代码中可以看到,RangeDependency和OneToOneDependency最大的区别是其实现方法中出现了outStart、length和instart参数,子RDD在通过getParents方法查询对应的Partition时,会根据这个partitionId减去插入时的开始ID,再加上它在父RDD中的位置ID,换而言之,就是将父RDD中的Partition根据partitionId的顺序依次插入到子RDD中。
分析完Spark中的源代码,下边通过两个实例来让大家了解RDD窄依赖输出的结果。
对于OneToOneDependency,采用map操作进行实验,实验代码和结果如下。
结果为:200 160 140。
对于RangeDependency,采用union操作进行实验,实验代码和结果如下。
结果为:spark scala hadoop SPARK SCALA HADOOP。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。