Spark源代码:DAGScheduler的新阶段

时间:2018-11-23 07:35:10

标签: scala apache-spark

我正在从Spark的0.5分支中读取DAGScheduler的源代码。

newStage方法:

  def newStage(rdd: RDD[_], shuffleDep: Option[ShuffleDependency[_,_,_]]): Stage = {
    cacheTracker.registerRDD(rdd.id, rdd.splits.size)
    ...
    val id = nextStageId.getAndIncrement()
    val stage = new Stage(id, rdd, shuffleDep, getParentStages(rdd))
    ...
  }

首先,它调用registerRDD来注册rdd,并实际上存储为Hashset

其次,它创建一个新的Stage。 在getParentStages内部,它将返回rdd的父级依赖关系,但是除了其父级之外,它还将始终再次注册此rdd

getParentStages的基本逻辑(伪代码)为:

def visit(rdd) {
   if (rdd not visited) {
      set rdd visited;
      registerRDD(rdd);
      for (each dep in rdd.dependencies) {
        visit(dep.rdd)
      }
  }
}
visit(rdd)

我认为,由于此rdd仍将在getParentStages中注册,是否有必要通过newStage方法进行注册?

当然,由于基础数据结构是HashSet,所以再次注册时不会发生任何事情。

0 个答案:

没有答案