在我们的应用程序中,我们有一个主要的火花作业[作业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