Spark Learning(RDD计算)

RDD计算


原始的RDD经过一系列转换后,会在最后一个RDD上触发一个动作,这个动作生成一个 jobjob 被划分为一批计算任务 task 后,会被提交到集群上的计算节点,计算节点中执行计算逻辑的部分称为 executor

  • Spark中的 task 分为 ShuffleMapTaskResultTask 两种。DAG最后一个阶段为每个结果的 Partition 生成一个 ResultTask ,其余阶段都会生成 ShuffleMapTask

Executor通过org.apache.spark.scheduler.Task.run() 调用 ShuffleMapTask 或者 ResultTaskrunTask() 方法执行Task。

//runTask会调用RDD的iterator方法,伪源码如下:
if(storageLevel != StorageLevel.NONE){
    //如果存储级别不是NONE,先检查是否有缓存,没有再进行计算
    SparkEnv.get.cacheManager.getOrCompute(...)
}else{
    //如果有CheckPoint那么直接读取结果,没有直接计算
    computeOrReadCheckPoint(...)
}
  • SparkEnv包含运行节点所需要的所有环境信息, cacheManager 是负责调用 BlockManager 来管理RDD缓存。SparkEnv除了cacheManger,还包括以下重要的成员变量:

    akka.actor.ActorSystem:运行在该节点的ActorSystem,其中运行在Driver上是sparkDriver,运行在Executor上是sparkExecutor。

    org.apache.spark.MapOutputTracker : 保存ShuffleMapTask输出的位置信息,其中在Driver上的Tracer是 MapOutputTrackerMaster ,在Executor上的Tracer是 MapOutputTrackerWorker

    org.apache.spark.shuffle.shuffleManager : Shuffle管理者,其中在Driver上会注册Shuffle信息,Executor会上报和获取Shuffle的信息 。

    org.apache.spark.storage.BlockManager : 提供了Storage模块与其他模块交互接口。

  • 用户在创建org.apache.spark.SparkContext时会创建SparkEnv。


Checkpoint 处理:在job结束后,会判断是否需要Checkpoint,若需要,调用 org.apache.spark.rdd.RDDCheckPointDatadoCheckpoint() 方法。

  • doCheckpoint首先为数据集创建一个目录,然后启动一个新的job计算,并调用 writeToFile() 将计算结果写入新创建的目录;接着创建 org.apache.spark.rdd.CheckpointRDD ;最后清除原始RDD依赖,依赖变为对应的CheckpointRDD。

RDD的计算逻辑是通过 org.apache.spark.rdd.RDDcompute() 方法实现的,每个特定的RDD都会实现compute,如CheckpointRDD的compute是直接读取checkpoint数据,HadoopRDD就是读取指定Partition的数据,MapPartitionsRDD就是将用户的转换逻辑作用到指定的Partition上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值