Spark Learning(RDD计算)

来源:互联网 发布:2017优化最好的游戏 编辑:程序博客网 时间:2024/06/06 19:17

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上。