纱线 - 需要在杀死另一份工作之前跑一份工作



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

每当纱线试图杀死主火花工作[工作1]?

在您的情况下,您必须从Spark-Submit中抓取纱线应用ID并检查作业状态

yarn application -status {Application ID}

yo需要在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>

option1:如果您不使用任何调度引擎,则该选项是使用Sparklauncher触发Spark作业可编程性。从普通的Scala应用程序中,您可以使用Spark Launcher触发第一个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提交提交(如果您确保在SetappResource中指定的罐子路径可用于Spark驱动程序)。)。p>选项2:使用Oozie安排工作。使用Oozie Spark Action运行作业1. Oozie提供了两个标签:<ok to="finish"> and <error to="job2">。如果出错,它将进行Job2的Spark Action。

应该没关系,因为当作业1死亡时,它不会影响作业2

的操作

相关内容

  • 没有找到相关文章

最新更新