在我们的应用程序中,我们有一个主要的Spark工作[Job 1]。每当主要的Spark作业因任何原因被杀死时,我们都需要提交另一个Spark作业[作业2]。
当YARN试图杀死主要的Spark作业[作业1]时,是否可以提交Spark作业[作业2]?
答案 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的操作