2017-08-20 25 views
1

私はJavaアプリケーションとSparkランチャー(launch()ではなくstartApplication()でジョブを開始する)を使用してスパーククラスター(YARNを使用)にプログラムを送信しています。 java-appでアクセスできるファイルで、Javaアプリケーションを実行するときにランチャーによってstdoutとstderrで生成されるすべてのログ出力を持っています。私はグローバルなspark-log-configを変更したくないので、毎回の実行時にjava-appから変数を変更することに応じて制御できる動的なソリューションが必要です。ファイルにスパークランチャー出力を保存する

documentationに続いて、これはCHILD_PROCESS_LOGGER_NAMEオプションを使用して可能になります。だから私はhereようjava.util.logging.Loggerのを定義し、私の仕事-ランチャーにこのコードを追加:

SparkLauncher.setConfig(SparkLauncher.CHILD_PROCESS_LOGGER_NAME, "MyLog"); 

しかし、これは動作しません、ログファイルは空です。私はsetConf(...)のような他のメソッドを試したり、addSparkArg(...)を追加して成功しませんでした。何が間違っていたのですか? または、log4jを使用してカスタム設定を行い、ランチャーに何らかの形で与えるのがよいでしょうか?はいの場合、私のjava-appでこれを行う方法は?

private static final Logger LOGGER = LoggerFactory.getLogger(JobSubmitter.class); 

SparkLauncher launcher = new SparkLauncher()............;//prepare launcher 

launcher.redirectToLog(JobSubmitter.class.getName()); 
     SparkAppHandle handler = launcher.startApplication(); 
     while (handler.getState() == null || !handler.getState().isFinal()) { 
      if (handler.getState() != null) { 
       LOGGER.info("Job state is :{} " , handler.getState()); 
       if (handler.getAppId() != null) { 
        LOGGER.info("App id: {} :: state:{}" , handler.getAppId() , handler.getState()); 
       } 
      } 
//Pause job to reduce job check frequency 
      Thread.sleep(jobStatusCheckInterval ==0?DEFAULT_JOB_STATUS_CHECK_INTERVAL:jobStatusCheckInterval); 
     } 

は、あなたが任意のクエリを使用している場合、コメントを追加します。以下は

答えて

1

は、私はSLF4J-のlog4jでsparkLauncherログを印刷するには使用されているコードスニペットです。

+0

私はグーグルでredirectToLog()メソッドも発見しましたが、私にとっては利用できず、すでに混乱していました。なぜ、私はそれを言及していたはずです:私はこの方法が実装されていない場所でスパーク1.6を使用しています!それでは、解決策を見つけるための遂行性は非常に低いようですが、私は思っています(あるいは、まだ別の方法がありますか?) – MUmla

+1

TomaszGuzialek [ここ](https://stackoverflow.com/questions/31754328/spark-ジョブ実行完了待ちのランチャー)は、出力/エラーストリームからログを取得するためにストリームを使用しています。 –

0

私はredirectOutput(java.io.File outFile)を試して、すべてのsparkLauncherのログをoutFileに取得できました。

関連する問題