web-dev-qa-db-ja.com

log4jを使用して、Spark YARNで実行されるアプリケーション内のローカルファイルシステムにログを記録する方法は?

Apache Sparkストリーミングアプリケーションを構築しています。ローカルファイルシステム上のファイルにログを記録できませんYARNで実行する場合。これを実現するにはどうすればよいですか?

log4.propertiesファイルを設定して、ローカルファイルシステムの/tmpディレクトリ内のログファイルに正常に書き込むことができるようにしました(以下に一部を示します)。

log4j.appender.file=org.Apache.log4j.FileAppender
log4j.appender.file.File=/tmp/application.log
log4j.appender.file.append=false
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

次のコマンドを使用してSparkアプリケーションをローカルで実行すると:

spark-submit --class myModule.myClass --master local[2] --deploy-mode client myApp.jar

正常に動作し、ログメッセージがローカルファイルシステムの/tmp/application.logに書き込まれていることがわかります。

しかし、YARN経由で同じアプリケーションを実行すると、.

spark-submit --class myModule.myClass --master yarn-client  --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar

または

spark-submit --class myModule.myClass --master yarn-cluster  --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar

YARNを実行しているマシンのローカルファイルシステムに/tmp/application.logが表示されません。

私は何が欠けています。

31
Emre Sevinç

[混乱を避けるために編集]

タスク/ジョブを起動するときに使用されるJVM引数に追加する必要があるようです。

ここで説明されている としてconf/spark-defaults.confを編集してみてください

spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j.properties

spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j.properties

代わりにconf/spark-env.shここで説明するように編集してみて 、同じJVM引数を追加しますが、conf/spark-defaults.confのエントリは機能するはずです。

それでも喜びが得られない場合、コマンドラインでlog4j.propertiesファイルの場所をspark-submitとともに明示的に渡すことができます。ファイルがJARファイル内およびルートディレクトリにある場合あなたのクラスパス

spark-submit --class sparky.MyApp --master spark://my.Host.com:7077 --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" myapp.jar

ファイルがクラスパスにない場合は、file:プレフィックスとこのようなフルパスを使用します

spark-submit ... --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j-executor.properties" ...
24
Brad

Spark.executor.extraJavaOptions、spark.driver.extraJavaOptionsを使用してlog4j.propertiesを指定する上記のオプションは、ローカルにのみログを記録し、log4.propertiesは各ノードにローカルに存在する必要があります。

https://spark.Apache.org/docs/1.2.1/running-on-yarn.html ドキュメンテーションで指定されているように、代わりにアプリケーションを使用してlog4j.propertiesをアップロードすることもできます-ファイルオプション。これにより、HDFSで糸の集約ロギングが行われ、コマンドを使用してログにアクセスできます

yarn logs -applicationId <application id>
8
Chandra

1)Spark YARNがlog4j設定を解釈する方法)をデバッグするには、log4j.debugフラグを使用します。

2)Sparkは2種類のYARNコンテナー、ドライバーとワーカーを作成します。したがって、アプリケーションを送信するファイルをすべてのコンテナーと共有する必要があります(内部でファイルを使用することはできません) JAR(これは実際に実行されるJARではないため)であるため、--files Spark submitディレクティブ(これはすべてのワーカーとファイルを共有します)を使用する必要があります。

このような:

spark-submit     
    --class com.X.datahub.djobi.Djobi \
    --files "./log4j.properties" \
    --driver-Java-options "-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties " \
    ./target/X-1.0.jar "$@"

Log4j.propertiesはsrc/main/resources/configフォルダー内のプロジェクトファイルです。

私はコンソールで見ることができます:

log4j: Trying to find [config/log4j.properties] using context 
classloader org.Apache.spark.util.MutableURLClassLoader@5bb21b69.
log4j: Using URL [jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties

そのため、ファイルは考慮され、Spark webUIもチェックできます。

3
Thomas Decaux

または、log4jのPropertyConfiguratorを使用して、カスタムログプロパティを定義できます。

例.

 import com.foo.Bar;

 import org.Apache.log4j.Logger;
 import org.Apache.log4j.PropertyConfigurator;

 public class MySparkApp {

   static Logger logger = Logger.getLogger(MySparkApp.class.getName());

   public static void main(String[] args) {

     // Location to property file
     PropertyConfigurator.configure(args[0]);

     logger.info("Entering application.");

     logger.info("Exiting application.");
   }
 }

プロパティファイルには次の小道具が必要です。

log4j.appender.file=org.Apache.log4j.FileAppender

log4j.appender.file.File=/tmp/application.log

log4j.appender.file.append=false

log4j.appender.file.layout=org.Apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

編集:log4jドキュメントへのリンクを更新します。 Sparkはv1.2ではなくlog4j 2を使用します

参照: http://logging.Apache.org/log4j/2.x/

1

Log4j.propertiesファイルで、log4j.rootCategoryINFO,consoleからINFO,fileに変更する必要もあります。

log4j.rootCategory=INFO, console    
log4j.rootCategory=INFO,file
1
Bing