首页 理论教育 窄依赖的优化措施的分析介绍

窄依赖的优化措施的分析介绍

时间:2023-06-29 理论教育 版权反馈
【摘要】:图2-1 窄依赖关系图在Spark的源代码中,把窄依赖分为两类:一类是一对一的依赖关系,在Spark中用OneToOneDependency来表示,它表示父RDD与子RDD的依赖关系是一对一的依赖关系,如图2-1中所示的map、filter和join with inputs co-partitioned;第二类是范围依赖关系,在Spark中用RangeDependency表示,它表示父RDD与子RDD的依赖关系是一对一的范围内的依赖关系。对于RangeDependency,采用union操作进行实验,实验代码和结果如下。

窄依赖的优化措施的分析介绍

RDD的窄依赖是RDD中最常见的依赖关系,用于表示每一个父RDD中的Partition最多被子RDD的1个Partition所使用,如图2-1所示,父RDD有2~3个Partition,每一个分区都只对应子RDD的1个Partition。

978-7-111-55442-4-Chapter02-1.jpg

图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的内容如下所示。

978-7-111-55442-4-Chapter02-2.jpg

可以看到,Spark的重写方法引入了参数partitionId,而在具体的方法中也使用了这个参数,这表明子RDD在通过getParents方法时,查询的是相同partitionId的内容,也就是说子RDD仅仅依赖父RDD中相同partitionID的Partition。

而Spark中关于窄依赖还有第二种依赖关系,即RangeDependency,Spark源代码中关于它的内容如下所示。

978-7-111-55442-4-Chapter02-3.jpg(www.xing528.com)

从代码中可以看到,RangeDependency和OneToOneDependency最大的区别是其实现方法中出现了outStart、length和instart参数,子RDD在通过getParents方法查询对应的Partition时,会根据这个partitionId减去插入时的开始ID,再加上它在父RDD中的位置ID,换而言之,就是将父RDD中的Partition根据partitionId的顺序依次插入到子RDD中。

分析完Spark中的源代码,下边通过两个实例来让大家了解RDD窄依赖输出的结果。

对于OneToOneDependency,采用map操作进行实验,实验代码和结果如下。

978-7-111-55442-4-Chapter02-4.jpg

结果为:200 160 140。

对于RangeDependency,采用union操作进行实验,实验代码和结果如下。

978-7-111-55442-4-Chapter02-5.jpg

978-7-111-55442-4-Chapter02-6.jpg

结果为:spark scala hadoop SPARK SCALA HADOOP。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈