我正在尝试使用 log4j2我的 Spark 工作中的记录器。基本要求:log4j2 配置位于类路径之外,因此我需要明确指定其位置。当我直接在 IDE 中运行代码而不使用spark-submit
, log4j2效果很好。但是,当我使用以下命令将相同的代码提交到 Spark 集群时spark-submit
,它无法找到 log42 配置并回退到默认的旧 log4j。
启动器命令
${SPARK_HOME}/bin/spark-submit \
--class my.app.JobDriver \
--verbose \
--master 'local[*]' \
--files "log4j2.xml" \
--conf spark.executor.extraJavaOptions="-Dlog4j.configurationFile=log4j2.xml" \
--conf spark.driver.extraJavaOptions="-Dlog4j.configurationFile=log4j2.xml" \
myapp-SNAPSHOT.jar
Maven 中的 Log4j2 依赖项
<dependencies>
. . .
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!-- Bridge log4j to log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!-- Bridge slf4j to log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependencies>
有什么想法我可能会错过吗?
显然目前 Spark 中还没有对 log4j2 的官方支持。以下是有关该主题的详细讨论:https://issues.apache.org/jira/browse/SPARK-6305 https://issues.apache.org/jira/browse/SPARK-6305
从实际角度来看,这意味着:
如果您有权访问 Spark 配置和 jar 并且可以修改它们,您仍然可以使用log4j2
手动将 log4j2 jar 添加到 SPARK_CLASSPATH 并提供log4j2
Spark 的配置文件。
如果您在托管 Spark 集群上运行并且无法访问 Spark jar/configs,那么您仍然可以使用log4j2
,但是它的使用仅限于在驱动程序端执行的代码。执行器运行的任何代码部分都将使用 Spark 执行器记录器(旧的 log4j)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)