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
が表示されません。
私は何が欠けています。
[混乱を避けるために編集]
タスク/ジョブを起動するときに使用される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" ...
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>
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もチェックできます。
または、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を使用します
Log4j.propertiesファイルで、log4j.rootCategory
をINFO,console
からINFO,file
に変更する必要もあります。
log4j.rootCategory=INFO, console
log4j.rootCategory=INFO,file