RDD源码分析--Iterator

时间:2023-01-29 18:26:39

RDD,Resilient Distributed Datasets,弹性分布式数据集。

在Spark中,通俗地可以认为是一个数据集合,只不过这个数据集合分布在不同的机器上,对外表现为一个整体。

一般来讲,对RDD进行操作比如map操作时分为两步,第一步为局部操作,即是对每台机器上的RDD的部分数据都进行map并行操作,第二步为汇总操作,将每台机器的执行结果进行汇总。

其中有一个问题是,RDD中的数据集合是分布的,RDD是如何确定每台机器上的数据集合的位置的呢?RDD是如何跟实际存储数据的集合对应起来的呢?

查看RDD源码

RDD源码分析--Iterator

查看Partition源码

RDD源码分析--Iterator

返回值Iterator为Scala自带类,参数split通过查看Partition不难看出是一个RDD的一个分区的标识,也就是说,通过输入参数某个分区的标识就可以获得这个分区的数据集合的迭代器,RDD与实际的某台机器上的数据集合就是这么联系起来的。RDD的Iterator方法只有这么一个,但是这个方法只能用来遍历某个Partition的数据,不能遍历整个RDD中的全部数据。

查看RDD的map方法

RDD源码分析--Iterator

查看MapPartitionsRDD

RDD源码分析--Iterator

在map方法中,返回值是一个新创建的MapPartitionRDD,不同于RDD是一个抽象类,MapPartitionRDD方法有自己的实现。

MapPartitionRDD类中的compute方法,是调用构造函数中的参数f,f是一个函数,f函数又是从map方法传入的,也就是说,map方法把具体要做的实现的函数传入MapPartitionsRDD,MapPartitionsRDD根据函数的不同有不同的实现,这就是scala的一个好处了,通过传入不同的函数参数可以实现不同的方法。在第三个参数中firstParent[T].iterator(split, context)中,可以看到iterator方法,所以f(context, split.index, firstParent[T].iterator(split, context))最终的返回值是一个Partition数据集合的一个迭代器,通过这个迭代器,RDD的map函数就能与实际的数据集合的map函数联系起来啦。