在Spark Java应用程序中使用log4j2

Vla*_*roz 2 log4j log4j2 apache-spark

我试图在我的Spark作业中使用log4j 2记录器。基本要求:log4j2配置位于类路径之外,因此我需要显式指定其位置。当我不使用IDE直接在IDE中运行代码时spark-submitlog4j2可以很好地工作。但是,当我使用提交相同的代码到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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

有什么想法我可能会错过吗?

Vla*_*roz 5

显然,目前Spark中没有log4j2的官方支持人员。这是关于此主题的详细讨论:https : //issues.apache.org/jira/browse/SPARK-6305

在实际方面意味着:

  1. 如果您有权访问Spark配置和jar,并且可以对其进行修改,则log4j2在将log4j2 jar手动添加到SPARK_CLASSPATH log4j2并向Spark 提供配置文件后,仍可以使用。

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