【问题标题】:How to override Spark's log4j.properties per driver?如何覆盖每个驱动程序的 Spark 的 log4j.properties?
【发布时间】:2015-05-04 14:44:02
【问题描述】:

我正在尝试覆盖 Spark 的默认 log4j.properties,但没有任何运气。我尝试将以下内容添加到 spark-submit:

--conf "spark.executor.extraJavaOptions=Dlog4j.configuration=/tmp/log4j.properties"  
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=/tmp/log4j.properties"

但这似乎不起作用。我还尝试在spark-submit 中使用--files 选项,但这似乎也不起作用。有没有人设置了日志记录,所以每个驱动程序都有一个 log4j.properties 文件,而不使用默认值?

我正在使用 Mesos 和 Marathon 运行 Spark 驱动程序。我不确定--files 选项,也找不到任何关于它的使用方式和具体作用的示例。

我还想提一下,我手动将 log4j.properties 文件上传到了我的所有节点,这些节点都有我的更改以供测试。

Spark 的版本目前为 1.1.0。

【问题讨论】:

  • 选项应该是-Dlog4j.configuration=file:/tmp/log4j.properties。另一种选择是将包含 log4j.properties 的目录添加到 --driver-class-path
  • @vanza 刚刚尝试了您的建议,但仍然没有运气。它一直在 conf 中使用默认的 log4j.properties 文件,而不是使用我指定的文件。
  • @vanza 我认为这不起作用,因为我在 conf 目录中有一个 log4j.properties 文件,这是类路径中的第一个文件。
  • 我可以看到导致它。我认为您可以通过设置 SPARK_CONF_DIR 来覆盖 conf 目录,但我从未尝试过。
  • @ColinMc 你最后是怎么解决这个问题的?

标签: apache-spark logging


【解决方案1】:

我不相信spark.driver.extraJavaOptions 参数存在。对于spark.executor.extraJavaOptions,您似乎有错字。试试这个:

--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=/tmp/log4j.properties"

【讨论】:

  • 您说得对,驱动程序参数不存在。我不记得我在运行这项工作时是否有那个错字。从 conf 目录中删除 log4j.properties 文件后,我能够成功使用 spark-submit --files 参数。
  • 如何使用 EMR 进行这项工作?这是aws emr 命令的参数吗?在运行作业之前如何将配置文件推送到主机?
  • 有 spark.driver.extraJavaOptions - spark.apache.org/docs/latest/configuration.html
【解决方案2】:

对于驱动程序/shell,您可以在运行 spark-shellspark-submit 脚本时使用 --driver-java-options 进行设置。

在 Spark 中,您不能设置 --conf spark.driver.extraJavaOptions,因为它是在 JVM 启动之后设置的。使用 spark 提交脚本时,--driver-java-options 会将这些选项替换为运行驱动程序的 JVM(例如 java -Dblah MyClass)的启动。

请注意,-Dlog4j.configuration 属性应该是一个有效的 URL,因此如果它来自文件系统的某个位置,请使用 file: URL。如果资源变量无法转换为 URL,例如由于 MalformedURLException,则 log4j 将从类路径中搜索资源。

例如,使用自定义 log4j.properties 文件;

./spark-shell --driver-java-options "-Dlog4j.configuration=file:///etc/spark/my-conf/log4j.warnonly.properties"

【讨论】:

    【解决方案3】:

    我做不到

    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=/tmp/log4j.properties"

    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:///tmp/log4j.properties"

    工作。

    唯一对我有用的是 --driver-java-options。

    【讨论】:

      【解决方案4】:

      只有几个细节是关闭的。

      conf 标志应如下所示:
      --conf spark.executor.extraJavaOptions="-Dlog4j.configuration=log4j.properties" --conf spark.driver.extraJavaOptions="-Dlog4j.configuration=/tmp/log4j.properties" --files /tmp/log4j.properties

      您还需要使用--files 参数将log4j.properties 文件上传到集群,执行程序可以访问它。此外,由于上述配置假设您使用client 模式,在cluster 中,两个配置将使用相同的相对路径:-Dlog4j.configuration=log4j.properties

      附:如果您的日志覆盖还需要其他依赖项,您可能还需要提供它们:--conf spark.driver.extraClassPath=custom-log4j-appender.jar 请参阅:custom-log4j-appender-in-spark-executor

      祝你好运

      【讨论】:

        【解决方案5】:

        有多种方法可以实现它,但这取决于您/应用程序需要为您的用例选择最好的一种 -

        • 通过为 Spark Driver 和 Executor 提供额外的 java 选项,而您的 log4j.properties 存在于集群的每个节点上的同一路径(或本地计算机,如果您在本地运行作业),请使用以下命令

          spark-submit --master local[2] --conf 'spark.driver.extraJavaOptions=Dlog4j.configuration=file:/tmp/log4j.properties' --conf 'spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/tmp/log4j.properties' --class com.test.spark.application.TestSparkJob target/application-0.0.1-SNAPSHOT-jar-with-dependencies.jar prod

        如果 log4j.properties 存在于根类路径的 jar 中,那么您可以在命令中跳过 file:,如下所示 --conf 'spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties' --conf 'spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j.properties'

        • 通过将 log4j.properties 文件传送到 yarn 并为 Spark Driver 和 Executor 提供额外的 java 选项,这样就不需要每个节点上的 log4j.properties,yarn 将在这种情况下进行管理,使用以下命令

          spark-submit --master local[2] --files /tmp/log4j.properties --conf 'spark.driver.extraJavaOptions=Dlog4j.configuration=log4j.properties' --conf 'spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j.properties' --class com.test.spark.application.TestSparkJob target/application-0.0.1-SNAPSHOT-jar-with-dependencies.jar prod

        • 通过更改 spark conf 或 spark 默认 log4j.properties 文件

          更改或更新 log4j.properties 在 /etc/spark/conf.dist/log4j.properties

        我已经尝试了所有这些并为我工作,我建议还通过以下 spark 帖子中的标题“调试您的应用程序”,这真的很有帮助 - https://spark.apache.org/docs/latest/running-on-yarn.html

        【讨论】:

        • 我验证如果使用“--files s3://xxx/xxxx/log4j.v2.properties”,则不需要有“file:”。所以这有效:--conf spark.executor.extraJavaOptions="-Dlog4j.configuration=log4j.properties"
        【解决方案6】:

        TL;DR

        我正在使用 Mesos 和 Marathon 运行 Spark 驱动程序。我不确定 --files 选项,也找不到任何关于它的使用方式和具体作用的示例。

        我还想提一下,我手动将 log4j.properties 文件上传到了我的所有节点,这些节点都有我的更改进行测试。

        由于您的log4j.properties 已经在您的节点上,您唯一的问题是您忘记了file: 前缀。就目前而言,您的 URI 无效。

        他们应该是:

        --conf "spark.executor.extraJavaOptions=Dlog4j.configuration=file:/tmp/log4j.properties"  
        --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/tmp/log4j.properties"
        

        添加log4j.properties--files

        spark-submit 期间将log4j.properties 发送到您的节点非常容易。 您需要指定:

        --files /absolute/path/to/your/log4j.properties 
        

        它们将在 spark-nodes 的根目录中可用,因此您可以通过以下方式访问它们:

        --conf "spark.executor.extraJavaOptions=Dlog4j.configuration=file:log4j.properties"  
        --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties"
        

        需要更多?

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

        【讨论】:

          猜你喜欢
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多