【问题标题】:Spark 2.1.1 Log4jLoggerFactory cannot be cast to LoggerContextSpark 2.1.1 Log4jLoggerFactory 无法转换为 LoggerContext
【发布时间】:2018-06-01 05:13:39
【问题描述】:

我正在尝试将 logback 用于 spark 流中的记录器。当我尝试通过 spark-submit 提交工作时,我遇到了如下异常。

线程“主”java.lang.ClassCastException 中的异常: org.slf4j.impl.Log4jLoggerFactory 不能转换为 ch.qos.logback.classic.LoggerContext 在 consumer.spark.LogBackConfigLoader.(LogBackConfigLoader.java:18) 在 consumer.spark.Sample.main(Sample.java:18) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:743) 在 org.apache.spark.deploy.SparkSubmit$$anon$1.run(SparkSubmit.scala:169) 在 org.apache.spark.deploy.SparkSubmit$$anon$1.run(SparkSubmit.scala:167) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1656) 在 org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:167) 在 org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126) 在 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>

我的登录代码是:

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 客户端 --driver-memory 4g --executor-memory 2g --executor-cores 4 --class consumer.spark.Sample ~/SparkStreamingJob/log_testing.jar ~/SparkStreamingJob/spark-jobs/config/conf/logback.xml

【问题讨论】:

  • 你的 logback 代码的导入包是什么?很难看出您正在使用哪个实现。具体来说,LoggerFactory 来自哪个包?

标签: java maven apache-spark logback


【解决方案1】:

这里似乎有两个问题:

SLF4J 是日志实现的外观,这基本上意味着您可以在不更改代码的情况下在日志框架之间进行更改。这也意味着你不应该使用各自的日志实现核心类。 SLF4J 本身解析日志实现,并且 SLF4j 提供的“记录器”或“工厂”对象绑定到该实现(在您的情况下为 logback)。这意味着你不能将 SLF4j 提供的“logger”对象或“factory”显式转换为 logback API 类型。

似乎 SLF4J 解析 log4jLoggerFactory 而不是 LogbackLoggerFactory。我认为 SLF4J 和 Logback 的桥接是不成功的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 2017-11-27
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2019-04-18
    • 2015-02-10
    • 2021-05-18
    相关资源
    最近更新 更多