我正在从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
,所以再次注册时不会发生任何事情。