【问题标题】:YARN - Need to run a job before killing another jobYARN - 在杀死另一个工作之前需要运行一个工作
【发布时间】:2017-11-30 07:12:44
【问题描述】:

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

是否可以在 YARN 尝试终止主要 Spark 作业[Job 1] 时提交 Spark 作业[Job 2]?

【问题讨论】:

  • 你在使用任何工作流管理器
  • 您如何提交/安排工作。分享这些信息。
  • @Amit Kumar:我们像往常一样使用 spark-submit 命令提交 spark 作业:spark-submit --class className --master yarn --deploy-mode cluster --supervise --executor -memory 2G --driver-memory 2G jarName.jar
  • @Achyuth Reg 工作流管理器:我们安装了 Zookeeper。但是我们没有使用 Zookeeper 来管理 Spark 应用程序

标签: apache-spark hadoop-yarn


【解决方案1】:

在您的情况下,您必须从 spark-submit grep 纱线应用程序 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】:

    选项 1:如果您不使用任何调度引擎,那么选项是使用 SparkLauncher 来触发您的 Spark 作业可编程性。在普通的 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 中指定的 jars 路径可用于 spark 驱动程序)。

    选项 2:使用 oozie 来安排您的工作。使用 oozie spark action 运行作业 1。Oozie 提供了两个标签:&lt;ok to="finish"&gt; and &lt;error to="job2"&gt;。如果出现错误,它将执行 job2 的 spark 操作。

    【讨论】:

      【解决方案3】:

      应该没问题,因为job 1死掉了,不影响job 2的运行

      【讨论】:

        猜你喜欢
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-29
        • 1970-01-01
        相关资源
        最近更新 更多