私はスパークランチャーライブラリを使ってClouderaスパーククラスターにスパークジョブを提出するWebアプリケーションを持っています。スパークランチャーのハンドルとリスナーは状態を与えていません
クラスタにスパークジョブを正常に送信しています。ただし、リスナークラスのメソッドを呼び出すのではなく、返されたSparkAppHandleのgetState()
も、ジョブがクラスタでの実行を終了した後も "UNKNOWN"から変更されません。
私はyarn-cluster
モードを使用しています。ここに私のコードです。他に何かをする必要がありますか?アプリケーションが起動されるとSparkAppHandle
へ
- 追加リスナーインスタンス:
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
を実装作られ、それを通過 - 少なくともIにより得
Process
オブジェクトに遮断することができるようにlauncher.launch()
方法を使用しようとしましたクラスタ上でスパークジョブが終了するまでprocess.waitFor()
メソッドを呼び出す。しかし、この場合、長時間実行されるスパークジョブの場合、このノードの対応するプロセスは返されません(1分または2分で終了するスパークジョブでは問題ありません)。
これを解決できるのはどこですか? – msemelman
スパークユーザーのメーリングリストに投稿した返信は、少なくとも1.6.0バージョン(1.5.1を使用しています)である必要があるということです。私が正常にそれをテストすると、私は答えとして投稿します。 – Reddy