Spark存储分析 - RDD存储调用与数据读写过程

通过之前章节,我们了解到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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值