通过之前章节,我们了解到RDD包含多个partition,每个Partition对应一个数据块Block,那么每个RDD中包含一个或多个数据块Block,每个Block拥有唯一的BlockId,对应数据块编号规则为:"rdd_" + rddId + "_" + splitIndex,其中splitIndex为该数据块对应Partition的序列号。
RDD存储调用
在存储级别一章中,我们知道在persist方法中并没有发生数据存储操作动作,实际发生数据操作是在任务运行过程中,RDD调用iterator方法时发生的。
final def iterator(split: Partition, context: TaskContext): Iterator[T] = {
if (storageLevel != StorageLevel.NONE) {
// 如果存在存储级别,尝试读取内存的数据进行迭代计算
SparkEnv.get.cacheManager.getOrCompute(this, split, context, storageLevel)
} else {
// 如果不存在存储级别,则直接读取数据进行迭代计算或读取检查点结果进行迭代计算
computeOrReadCheckpoint(split, context)
}
}
getOrCompute方法是存储逻辑的核心,代码如下:
def getOrCompute[T](
rdd: RDD[T],
partition: Partition,
context: TaskContext,
storageLevel: Storag