spark如何将作业发送到集群?

时间:2017-09-09 13:35:58

标签: java scala apache-spark

我正在使用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,驱动程序如何与群集通信?这段代码在哪里?有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

如您所知,Spark可以在多个集群管理器上运行。 Spark通过使用名为 SchedulerBackend 的抽象实现了这一点。

对于YARN,有两种实现方式:

  1. YarnClientSchedulerBackend(用于客户端部署模式)
  2. YarnSchedulerBackend(用于集群部署模式)
  3. 以下是源代码:https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/scheduler/SchedulerBackend.scala