YARN - 在杀死另一份工作之前需要经营一份工作

时间:2017-11-29 09:32:34

标签: apache-spark yarn

在我们的应用程序中,我们有一个主要的Spark工作[Job 1]。每当主要的Spark作业因任何原因被杀死时,我们都需要提交另一个Spark作业[作业2]。

当YARN试图杀死主要的Spark作业[作业1]时,是否可以提交Spark作业[作业2]?

3 个答案:

答案 0 :(得分:0)

选项1:如果您没有使用任何计划引擎,那么选项是使用SparkLauncher来触发您的火花作业可编程性。从普通的scala应用程序,您可以使用Spark启动器触发第一个spark作业,并轮询其最终状态。根据最终状态“失败/被杀”,启动第二份工作。 伪代码如下:

import org.apache.spark.launcher.SparkLauncher

object SparkSchedule {
  def main(args: Array[String]) {
    //launch job1
    val job1 = new SparkLauncher()
      .setAppResource("/usr/local/spark/lib/spark-examples-1.6.3-hadoop2.6.0.jar")
      .setMainClass("org.apache.spark.examples.SparkPi")
      .setMaster("local")
      .setAppName("launch")
      .setVerbose(true).startApplication()

    println("app id" + job1.getAppId)
    println("app state" + job1.getState)

    while (!(job1.getState.isFinal())) {
      //waiting for the job1 completion status
      println("app is final" + job1.getState.isFinal())
      Thread.sleep(1000)
    }
    val finalJobState = job1.getState;//get the final status of the job1
    //check for failed or killed and launch job2
    if(finalJobState.equalsIgnoreCase("Failed") || finalJobState.equalsIgnoreCase("killed")){
      //launch the job2 same way as above 
      val job2 = new SparkLauncher()
      .setAppResource("/usr/local/spark/lib/spark-examples-1.6.3-hadoop2.6.0.jar")
      .setMainClass("org.apache.spark.examples.SparkPi")
      .setMaster("local")
      .setAppName("launch")
      .setVerbose(true).startApplication()
    }
  }
}

您可以通过scala jar选项运行“SparkSchedule”类,也可以通过spark submit提交它(如果这样可以确保您在setAppResource中指定的jar路径可用于spark驱动程序)。

选项2:使用oozie安排工作。使用oozie spark动作来运行作业1.Oozie提供两个标签:<ok to="finish"> and <error to="job2">。如果出现错误,它将进入job2的spark动作。

答案 1 :(得分:0)

在您的情况下,您必须从spark-submit中获取纱线应用程序ID并检查作业的状态

yarn application -status {Application ID}

在shell脚本中需要一个循环,并在完成该过程时启动。

oozie是工作依赖的解决方案。

<action name='l1persistence'>
        <spark
            xmlns="uri:oozie:spark-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <master>${master}</master>
            <name>process</name>
            <class>Driverpath</class>
            <jar>${appLib}</jar>
            <spark-opts>--jars ${sparkLib} --files ${hiveSite}</spark-opts>
            <arg>${resourcePath}/${layer1PropertiesFileName}</arg>
            <arg>${resourcePath}/${envConfigPropertiesFileName}</arg>
            <arg>PersistenceLayer1</arg>
            <arg>${resourcePath}/${dqPropertiesFileName}</arg>
        </spark>
        <ok to='nextjob' />
        <error to="sendEmailKill" />
    </action>

答案 2 :(得分:-2)

应该没问题,因为当工作1死亡时,它不会影响工作2的操作