[英]How to log using log4j to local file system inside a Spark application that runs on YARN?
我正在構建一個 Apache Spark Streaming 應用程序,但在 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
不到任何/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 指定 log4j.properties 的選項,spark.driver.extraJavaOptions 只會在本地記錄它,並且 log4.properties 應該存在於每個節點的本地。
如https://spark.apache.org/docs/1.2.1/running-on-yarn.html文檔中所述,您也可以使用 --files 選項上傳 log4j.properties 和您的應用程序。 這將在 HDFS 上進行紗線聚合日志記錄,您可以使用以下命令訪問日志
yarn logs -applicationId <application id>
1) 要調試 YARN 上的 Spark 如何解釋您的 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 使用 log4j 2,而不是 v1.2
在您的 log4j.properties 文件中,您還應該將log4j.rootCategory
從INFO,console
修改為INFO,file
。
log4j.rootCategory=INFO, console
log4j.rootCategory=INFO,file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.