【问题标题】:spark-submit, how to specify log4j.propertiesspark-submit,如何指定 log4j.properties
【发布时间】:2017-07-02 23:36:46
【问题描述】:

在spark-submit中,如何指定log4j.properties?

这是我的脚本。我尝试了所有组合,甚至只使用一个本地节点。但看起来 log4j.properties 没有加载,所有调试级别信息都被转储了。

current_dir=/tmp
DRIVER_JAVA_OPTIONS="-Dlog4j.configuration=file://${current_dir}/log4j.properties "

spark-submit \
--conf "spark.driver.extraClassPath=$current_dir/lib/*"  \
--conf "spark.driver.extraJavaOptions=-Djava.security.krb5.conf=${current_dir}/config/krb5.conf -Djava.security.auth.login.config=${current_dir}/config/mssqldriver.conf" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file://${curent_dir}/log4j.properties " \
--class "my.AppMain" \
--files ${current_dir}/log4j.properties \
--master local[1] \
--driver-java-options "$DRIVER_JAVA_OPTIONS" \
--num-executors 4 \
--driver-memory 16g \
--executor-cores 10 \
--executor-memory 6g \
$current_dir/my-app-SNAPSHOT-assembly.jar

log4j 属性:

log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.additivity.org=false

log4j.logger.org=WARN
parquet.hadoop=WARN
log4j.logger.com.barcap.eddi=WARN
log4j.logger.com.barcap.mercury=WARN
log4j.logger.yarn=WARN
log4j.logger.io.netty=WARN
log4j.logger.Remoting=WARN   
log4j.logger.org.apache.hadoop=ERROR

# this disables the table creation logging which is so verbose
log4j.logger.hive.ql.parse.ParseDriver=WARN

# this disables pagination nonsense when running in combined mode
log4j.logger.com.barcap.risk.webservice.servlet.PaginationFactory=WARN

【问题讨论】:

  • 您只是在执行程序上指定-Dlog4j.configuration。这是故意的吗?
  • 我从来没有在 Hadoop 上使用 -Dlog4j.configuration= 运气。由于“log4j.properties”是默认文件名,只需尝试在驱动程序CLASSPATH中添加包含该文件的目录,Log4J就会找到它。或者更简单,将您的文件连同spark-default.conf 和朋友一起放入您的$SPARK_CONF_DIR...
  • 首先尝试直接执行此操作,即使用非常简单的程序并执行 spark-submit --dirver-java-options "-Dlog4j.configuration=file:///home/username/file。道具”没有其他任何东西。它应该工作。如果不是,则可能是您的代码依赖于其他 slf4j 实现并使用该实现代替(这意味着它可能会采用它们的属性)。

标签: apache-spark log4j slf4j


【解决方案1】:

请注意,Spark worker 不是您的 Java 应用程序,因此您不能使用类路径中的 log4j.properties 文件。

要了解 Spark on YARN 将如何读取 log4j.properties 文件,您可以使用 log4j.debug=true 标志:

spark.executor.extraJavaOptions=-Dlog4j.debug=true

大多数时候,错误是在工作 YARN 容器中找不到/可用的文件。有一个非常有用的 Spark 指令允许共享文件:--files

--files "./log4j.properties"

这将使您的所有驱动程序/工作人员都可以使用此文件。添加 Java 额外选项:

-Dlog4j.configuration=log4j.properties

等等!

log4j: Using URL [file:/var/log/ambari-server/hadoop/yarn/local/usercache/hdfs/appcache/application_1524817715596_3370/container_e52_1524817715596_3370_01_000002/log4j.properties] for automatic log4j configuration.

【讨论】:

    【解决方案2】:

    如何传递本地log4j.properties文件

    正如我从您的脚本中看到的那样:

    1. 将本地log4j.properties 传递给执行者
    2. 使用此文件进行节点配置。

    注意关于--files设置的两点:

    1. 使用--files 上传到spark-cluster 的文件将在执行器工作区的根目录下可用,因此无需在file:log4j.properties 中添加任何路径。
    2. --files 中列出的文件必须提供绝对路径!

    现在修复您的 sn-p 非常容易:

    current_dir=/tmp
    log4j_setting="-Dlog4j.configuration=file:log4j.properties"
    
    spark-submit \
    ...
    --conf "spark.driver.extraJavaOptions=${log4j_setting}" \
    --conf "spark.executor.extraJavaOptions=${log4j_setting}" \
    --class "my.AppMain" \
    --files ${current_dir}/log4j.properties \
    ...
    $current_dir/my-app-SNAPSHOT-assembly.jar
    

    需要更多?

    如果您想了解在使用spark-submit 时配置日志记录的其他方式,请访问我的其他详细答案:https://stackoverflow.com/a/55596389/1549135

    【讨论】:

      【解决方案3】:

      只是补充, 可以直接通过 spark-submit 传递 conf,不需要修改默认的 conf 文件

      --conf spark.driver.extraJavaOptions=-Dlog4j.configuration=file:///export/home/siva/log4j.properties

      我在命令下运行,它运行良好

      /usr/hdp/latest/spark2/bin/spark-submit --master local[*] --files ~/log4j.properties --conf spark.sql.catalogImplementation=hive --conf spark.driver.extraJavaOptions =-Dlog4j.configuration=file:///export/home/siva/log4j.properties ~/SCD/spark-scd-assembly-1.0.jar test_run

      注意:如果您在 conf 文件中配置了额外的 java 选项,只需追加并提交

      【讨论】:

        【解决方案4】:
        1. 将 spark-defaults.conf 复制到新的 app-spark-defaults.conf 中
        2. 将 -Dlog4j.configuration=file://log4j.properties 添加到 app-spark-defaults.conf 中的 spark.driver.extraJavaOptions。例如:

          spark.driver.extraJavaOptions -XXOther_flag -Dlog4j.configuration=file://log4j.properties

        3. 使用 --properties-file 将 spark 运行到新的 conf 文件。 例如:
          spark-submit --properties-file app-spark-defaults.conf --class my.app.class --master yarn --deploy-mode client ~/my-jar.jar

        【讨论】:

        • 哦,好吧。我无法弄清楚如何在纱线集群上运行
        【解决方案5】:

        纱线火花解决方案

        对我来说,在纱线上运行 spark,只需添加 --files log4j.properties 就可以了。
        1. 确保您运行 spark-submit 的目录包含文件“log4j.properties”。
        2. 运行 spark-submit ... --files log4j.properties

        让我们看看为什么会这样

        1.spark-submit 会像这样将 log4j.properties 上传到 hdfs

        20/03/31 01:22:51 INFO Client: Uploading resource file:/home/ssd/homework/shaofengfeng/tmp/firesparkl-1.0/log4j.properties -> hdfs://sandbox/user/homework/.sparkStaging/application_1580522585397_2668/log4j.properties
        

        2.当yarn为driver或executor启动容器时,yarn会下载所有上传到node本地文件缓存中的文件,包括${spark_home}/jars、${spark_home}/conf和${hadoop_conf_dir}下的文件和指定的文件通过 --jars 和 --files。
        3.在launcher容器之前,yarn导出classpath,做这样的软链接

        export CLASSPATH="$PWD:$PWD/__spark_conf__:$PWD/__spark_libs__/*:$HADOOP_CONF_DIR:/usr/hdp/current/hadoop-client/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-hdfs-client/*:/usr/hdp/current/hadoop-hdfs-client/lib/*:/usr/hdp/current/hadoop-yarn-client/*
        
        ln -sf "/var/hadoop/yarn/local/usercache/homework/filecache/1484419/log4j.properties" "log4j.properties"
        hadoop_shell_errorcode=$?
        if [ $hadoop_shell_errorcode -ne 0 ]
        then
          exit $hadoop_shell_errorcode
        fi
        ln -sf "/var/hadoop/yarn/local/usercache/homework/filecache/1484440/apache-log4j-extras-1.2.17.jar" "apache-log4j-extras-1.2.17.jar"
        

        4.step3之后,“log4.properties”已经在CLASSPATH中,无需设置 spark.driver.extraJavaOptions 或 spark.executor.extraJavaOption.

        【讨论】:

          【解决方案6】:

          如果这只是一个自学项目或小型开发项目,hadoop_home/conf中已经有一个log4j.properties。只需编辑那个,添加您自己的记录器

          【讨论】:

          • 在大多数安装中,运行该作业的人与控制 hadoop_home 的人不同
          猜你喜欢
          • 2021-12-11
          • 2023-04-09
          • 1970-01-01
          • 2016-05-11
          • 2016-02-28
          • 2017-10-18
          • 1970-01-01
          • 1970-01-01
          • 2017-06-23
          相关资源
          最近更新 更多