私たちのアプリケーションでは、主なSparkジョブ[ジョブ1]があります。主なSparkジョブが何らかの理由で死亡すると、別のSparkジョブを提出する必要があります[Job 2]。YARN - 別のジョブを殺す前にジョブを実行する必要があります
YARNがスパークジョブ[ジョブ1]を強制終了しようとすると、スパークジョブ[ジョブ2]を送信できますか?
私たちのアプリケーションでは、主なSparkジョブ[ジョブ1]があります。主なSparkジョブが何らかの理由で死亡すると、別のSparkジョブを提出する必要があります[Job 2]。YARN - 別のジョブを殺す前にジョブを実行する必要があります
YARNがスパークジョブ[ジョブ1]を強制終了しようとすると、スパークジョブ[ジョブ2]を送信できますか?
ジョブは1個のダイス、それはジョブ2
オプション1の動作に影響を与えないときので、[OK]をする必要があります:あなたは任意のスケジューリングエンジンを使用していない場合は、オプションでは、あなたのをトリガするSparkLauncherを使用することですジョブのプログラマビリティを発揮します。通常のスカラアプリケーションから、Sparkランチャを使用して最初のスパークジョブをトリガし、その最終ステータスをポーリングすることができます。最終ステータス "Failed/Killed"に基づいて、2番目のジョブを開始します。 擬似コードは以下の通りです:
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のジャーオプションから「SparkSchedule」クラスを実行することができ、またはあなたは、これはあなたが指定した確認のjarファイルのパスを作る場合(だけでなく提出スパークを通してそれを提出することができますsparkドライバではsetAppResource内にあります)。
オプション2:あなたの仕事をスケジュールするためにoozieを使用してください。 oozie sparkアクションを使用してジョブ1を実行します.Oozieには2つのタグ、<ok to="finish"> and <error to="job2">
があります。エラーの場合は、job2のスパークアクションに進みます。あなたのケースでは
ヨーヨーから糸アプリケーションIDをgrepしする必要が火花提出し、ヨはシェルスクリプトでループを必要とし、それがプロセスを完了すると、ジョブ開始
yarn application -status {Application ID}
のステータスを確認します。
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>
は、あなたが提出されているどのようにジョブをスケジュール/任意のワークフローマネージャ – Achyuth
を使用しています。その情報を共有する。 –
@Amit Kumar:通常通りspark-submitコマンドを使用してスパークジョブを送信します:** spark-submit --class className - master yarn --deploy-mode cluster --supervise --executor-memory 2G --driver-memory 2G jarName.jar ** – Raghav