簡體   English   中英

如何使用 log4j 登錄到在 YARN 上運行的 Spark 應用程序內的本地文件系統?

[英]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

參考: http : //logging.apache.org/log4j/2.x/

在您的 log4j.properties 文件中,您還應該將log4j.rootCategoryINFO,console修改為INFO,file

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM