带有Spark throw的Kafka无法初始化类kafka.utils.Log4jController错误

时间:2018-03-10 04:39:19

标签: java apache-spark apache-kafka spark-streaming

我正在尝试使用Apache spark在java中编写kafka使用者。由于某些Log4jController错误,代码未执行。不知道我错过了什么。

pom.xml文件如下:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-streaming_2.11</artifactId>
  <version>2.3.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
    <version>2.3.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka_2.11</artifactId>
  <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

出现以下错误

5645 [dag-scheduler-event-loop] INFO  org.apache.spark.scheduler.DAGScheduler  - ResultStage 11 (start at RuleEngine.java:431) failed in 0.094 s due to Job aborted due to stage failure: Task 0 in stage 11.0 failed 1 times, most recent failure: Lost task 0.0 in stage 11.0 (TID 8, localhost, executor driver): java.lang.NoClassDefFoundError: Could not initialize class kafka.utils.Log4jController$

编辑:

我能够通过更改pom.xml中的kafka客户端版本来解决此问题

      <dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>2.11.0</version>
  </dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-streaming_2.11</artifactId>
  <version>2.3.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.11</artifactId>
    <version>0.8.2.2</version>
</dependency>

2 个答案:

答案 0 :(得分:1)

你的主要问题是抛出noClassDefFoundError:

  

如何解决java.lang.NoClassDefFoundError:

     
      
  1. Class Classpath中没有类。
  2.   
  3. 您可能正在使用jar命令运行程序,并且未在清单文件的ClassPath属性中定义类。
  4.   
  5. 任何启动脚本都会覆盖Classpath环境变量。
  6.   
  7. 因为NoClassDefFoundError是java.lang.LinkageError的子类,所以如果其中一个依赖项(如本机库)可能不可用,它也会出现。
  8.   
  9. 检查日志文件中的java.lang.ExceptionInInitializerError。由于静态初始化失败而导致的NoClassDefFoundError非常普遍。
  10.   
  11. 如果您在J2EE环境中工作,而多个类加载器中的Class的可见性也会导致java.lang.NoClassDefFoundError,请参阅示例和场景部分以进行详细讨论。
  12.   

您可以点击此链接了解更多详情: noClassDefFoundError

答案 1 :(得分:1)

检查你的pom,问题似乎是你正在使用kafka 1.0.0但是使用spark-streaming-kafka-0-8,这是期待kafka 0.8。 的确,searching for kafka.utils.Log4jController 显示它是版本0.8.1和0.8.2中的kafka-clients库的一部分,但在更高版本中没有。我不是Spark的专家,但我认为你只需要找到一个与你的kafka版本相匹配的spark-streaming-kafka库。希望有所帮助