2017-11-29 12 views
0

私たちのアプリケーションでは、主なSparkジョブ[ジョブ1]があります。主なSparkジョブが何らかの理由で死亡すると、別のSparkジョブを提出する必要があります[Job 2]。YARN - 別のジョブを殺す前にジョブを実行する必要があります

YARNがスパークジョブ[ジョブ1]を強制終了しようとすると、スパークジョブ[ジョブ2]を送信できますか?

+0

は、あなたが提出されているどのようにジョブをスケジュール/任意のワークフローマネージャ – Achyuth

+0

を使用しています。その情報を共有する。 –

+0

@Amit Kumar:通常通りspark-submitコマンドを使用してスパークジョブを送信します:** spark-submit --class className - master yarn --deploy-mode cluster --supervise --executor-memory 2G --driver-memory 2G jarName.jar ** – Raghav

答えて

-2

ジョブは1個のダイス、それはジョブ2

0

オプション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のスパークアクションに進みます。あなたのケースでは

0

ヨーヨーから糸アプリケーション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> 
関連する問題