在 Spark java 应用程序中使用 log4j2

2024-04-19

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

从实际角度来看,这意味着:

  1. 如果您有权访问 Spark 配置和 jar 并且可以修改它们,您仍然可以使用log4j2手动将 log4j2 jar 添加到 SPARK_CLASSPATH 并提供log4j2Spark 的配置文件。

  2. 如果您在托管 Spark 集群上运行并且无法访问 Spark jar/configs,那么您仍然可以使用log4j2,但是它的使用仅限于在驱动程序端执行的代码。执行器运行的任何代码部分都将使用 Spark 执行器记录器(旧的 log4j)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spark java 应用程序中使用 log4j2 的相关文章

随机推荐