2016-08-24 7 views
2

私はスパークランチャーライブラリを使ってClouderaスパーククラスターにスパークジョブを提出するWebアプリケーションを持っています。スパークランチャーのハンドルとリスナーは状態を与えていません

クラスタにスパークジョブを正常に送信しています。ただし、リスナークラスのメソッドを呼び出すのではなく、返されたSparkAppHandlegetState()も、ジョブがクラスタでの実行を終了した後も "UNKNOWN"から変更されません。

私はyarn-clusterモードを使用しています。ここに私のコードです。他に何かをする必要がありますか?アプリケーションが起動されるとSparkAppHandle

  1. 追加リスナーインスタンス:

    SparkLauncher launcher = new SparkLauncher() 
              .setSparkHome("sparkhome") 
              .setMaster("yarn-cluster") 
              .setAppResource("spark job jar file") 
              .setMainClass("spark job driver class") 
              .setAppName("appname") 
              .addAppArgs(argsArray) 
              .setVerbose(true) 
              .addSparkArg("--verbose"); 
    
    SparkAppHandle handle = launcher.startApplication(new LauncherListener()); 
    
    int c = 0; 
    while(!handle.getState().isFinal()) { 
        LOG.info(">>>>>>>> state is= "+handle.getState()); 
        LOG.info(">>>>>>>> state is not final yet. counter= "+c++); 
        LOG.info(">>>>>>>> sleeping for a second"); 
        try { 
        Thread.sleep(1000L); 
        } catch (InterruptedException e) { 
        } 
        if(c == 200) 
        break; 
    } 
    

    は、ここで私はすでに試してみましたものです。 (起動中、およびSparkAppHandle上に設定することによって)の両方の方法で、(this)現在のクラスがSparkAppHandle.Listenerを実装作られ、それを通過

  2. 少なくともIにより得Processオブジェクトに遮断することができるようにlauncher.launch()方法を使用しようとしましたクラスタ上でスパークジョブが終了するまでprocess.waitFor()メソッドを呼び出す。しかし、この場合、長時間実行されるスパークジョブの場合、このノードの対応するプロセスは返されません(1分または2分で終了するスパークジョブでは問題ありません)。
+0

これを解決できるのはどこですか? – msemelman

+2

スパークユーザーのメーリングリストに投稿した返信は、少なくとも1.6.0バージョン(1.5.1を使用しています)である必要があるということです。私が正常にそれをテストすると、私は答えとして投稿します。 – Reddy

答えて

0

sparkユーザーメーリングリスト。この機能が動作するためには、スパークランチャーだけでなく、1.6.0である必要がありますが、基礎となるスパークも少なくとも1.6.0である必要があります。

私はspark 1.5.1と1.6.0バージョンのランチャーライブラリを使用しています。今度はspark clusterを1.6.0にアップデートしました。今ではlistenerメソッドへのコールバックを取得しています。

+0

これを行うには何が必要でしたか?私も同じ問題に直面しています。アプリケーションは即座に終了し、appIDと状態を取得します。明示的にThread.sleep()を呼び出すと動作します。ありがとうございました! - – Tariq

+0

私が直面した問題は、状態やappIDがまったく得られませんでした。あなたがスパークジョブが終了するのを待っていたいと思うなら、ハンドルの状態を最終状態(handle.getState()。isFinal()に到達するまで)にポーリングするループを置くことができます。 – Reddy

関連する問題