如何在Driver中覆盖Spark的log4j.properties文件?

24

我正在尝试覆盖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
1
@vanza,我刚尝试了你的建议,但还是没有成功。它仍然使用 conf 中的默认 log4j.properties 文件,而不是我指定的那个文件。 - ColinMc
@vanza 我认为这个没有起作用是因为在conf目录下有一个log4j.properties文件,而且它是classpath中的第一个。 - ColinMc
我可以看到这会导致它。我认为你可以通过设置SPARK_CONF_DIR来覆盖conf目录,但我从未尝试过。 - vanza
@ColinMc 你最终是如何解决这个问题的? - void
@AswinJoseRoy 我记不清这个问题是否已经解决。我不再为使用Spark的那家公司工作,因此无法评论任何答案是否是正确的解决方案。 - ColinMc
6个回答

18

在驱动程序/ shell 中,您可以在运行 spark-shellspark-submit 脚本时使用 --driver-java-options 来设置这个参数。

在Spark中,您不能设置 --conf spark.driver.extraJavaOptions ,因为该参数是在JVM启动之后设置的。当使用spark-submit脚本时,--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"

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配置或Spark默认的log4j.properties文件 更改或更新/etc/spark/conf.dist/log4j.properties中的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" - Ning Liu
第一个选项对我有效,Spark 3.0.1 独立版。 - Arkadiy Verman

4

只有一些细节不对。

配置标志应该像这样:
--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

祝你好运


2

简介

我正在使用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"

使用--files参数添加log4j.properties

spark-submit期间向节点发送log4j.properties非常容易。

您需要指定:

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

这些文件将在Spark节点的根目录中提供,因此您可以使用以下方式访问它们:

Original Answer翻译成"最初的回答"

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

需要更多吗?

如果您想了解在使用spark-submit时配置日志的其他方法,请查看我的另一个详细回答:https://dev59.com/P14c5IYBdhLWcg3wjrDR#55596389



"Original Answer" 翻译成 "最初的回答"

2

我无法让以下两种方式之一正常工作:

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

或者

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

对我来说唯一可行的方法是--driver-java-options。


1
我不相信spark.driver.extraJavaOptions参数的存在。对于spark.executor.extraJavaOptions,你似乎打错了字。尝试这样做:
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=/tmp/log4j.properties"

你说的关于 driver 参数不存在是正确的。我不记得在运行作业时是否有这个错别字。在从 conf 目录中删除 log4j.properties 文件后,我成功地使用了 spark-submit --files 参数。 - ColinMc
我该如何在EMR上使其工作?这是aws emr命令的参数吗?在运行作业之前,您如何将配置文件推送到主机? - Synesso
有一个名为spark.driver.extraJavaOptions的参数 - https://spark.apache.org/docs/latest/configuration.html - kensai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接