Spark 2.1.1 Log4jLoggerFactory无法强制转换为LoggerContext

问题描述 投票:0回答:1

我正在尝试在火花流中使用logback for logger。当我试图通过spark-submit提交工作时,我会得到如下例外情况。

线程“main”中的异常java.lang.ClassCastException:org.slf4j.impl.Log4jLoggerFactory无法转发到consumer.spark上的consumer.spark.LogBackConfigLoader。(LogBackConfigLoader.java:18)的ch.qos.logback.classic.LoggerContext。 .sample.main(Sample.java:18)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) :43)atg.apache.spark.deploy.SparkSubmit $ .org $ apache $ spark $ deploy $ java.lang.ref。 )atg.apache.spark.deploy.SparkSubmit $$ anon $ 1.run(SparkSubmit.scala:169)at org.apache.spark.deploy.SparkSubmit $$ anon $ 1.run(SparkSubmit.scala:167)at java。 security.AccessController.doPrivileged(Native Method)位于org.apache.hadoop.security.UserGroupInformation.doAs的javax.security.auth.Subject.doAs(Subject.java:422)(UserGroupInformation.java:1 656)org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:167)位于org.apache.spark的org.apache.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:212)。 deploy.SparkSubmit $ .main(SparkSubmit.scala:126)at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我的pom.xml是:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <slf4j.version>1.6.1</slf4j.version>
    <logback.version>1.2.3</logback.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

我的logback代码是:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
configurator.doConfigure(externalConfigFileLocation);

我的spark-submit命令是:

〜/ spark-2.1.1-bin-hadoop2.6 / bin / spark-submit --master yarn --deploy-mode client --driver-memory 4g --executor-memory 2g --executor-cores 4 --class consumer.spark.Sample~ / SparkStreamingJob / log_testing.jar~ / SparkStreamingJob / spark-jobs / config / conf / logback.xml

java maven apache-spark logback
1个回答
0
投票

看来这里有两个问题:

SLF4J是日志记录实现的外观,基本上意味着您可以在不更改代码的情况下在日志记录框架之间进行更改。这也意味着您不应该使用相应的日志记录实现核心类。 SLF4J本身解决了日志记录实现,SLF4j提供的“logger”或“factory”对象绑定到该实现(在您的情况下为logback)。所有这些意味着您无法明确地将SLF4j提供的“logger”对象或“factory”强制转换为logback API类型。

此外,它似乎SLF4J解析log4jLoggerFactory而不是LogbackLoggerFactory。我相信SLF4J和Logback的桥接并不成功。

© www.soinside.com 2019 - 2024. All rights reserved.