我正在使用YARN
并尝试了解Spark如何将作业发送到具有YARN的群集。所以我挖掘了资源并发现当我们提交工作时(例如foreach
),正在SparkContext::runJob
执行以下方法:
dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, resultHandler, localProperties.get)
然后在
创建JobWaiter
DAGScheduler::submitJob
正在发布JobSubmitted
事件。该事件正在
DAGSchedulerEventProcessLoop::handleJobSubmitted
将另一个事件(SparkListenerJobStart
)发布到侦听器总线。然后调用
DAGScheduler::submitStage
因此,在方法中似乎应该存在将阶段提交到集群的逻辑。但我唯一看到的就是:
private def submitStage(stage: Stage) {
val jobId = activeJobForStage(stage)
if (jobId.isDefined) {
logDebug("submitStage(" + stage + ")")
if (!waitingStages(stage) && !runningStages(stage) && !failedStages(stage)) {
val missing = getMissingParentStages(stage).sortBy(_.id)
logDebug("missing: " + missing)
if (missing.isEmpty) {
logInfo("Submitting " + stage + " (" + stage.rdd + "), which has no missing parents")
submitMissingTasks(stage, jobId.get)
} else {
for (parent <- missing) {
submitStage(parent)
}
waitingStages += stage
}
}
} else {
abortStage(stage, "No active job for stage " + stage.id, None)
}
}
实际上,我在那里预计会有一些类似NIO的代码。
问题 :如果我们使用YARN
,驱动程序如何与群集通信?这段代码在哪里?有人能帮助我吗?
答案 0 :(得分:1)
如您所知,Spark可以在多个集群管理器上运行。 Spark通过使用名为 SchedulerBackend 的抽象实现了这一点。
对于YARN,有两种实现方式: