spark版本:2.1.1,kafka API版本:0.8

误如下

[WARN ] 2018-01-25 14:54:01,332 org.apache.spark.scheduler.TaskSetManager - Lost task 3.0 in stage 0.0 (TID 3, ip-10-0-155-42.eu-west-1.compute.internal, executor 8): java.lang.NoSuchMethodError: net.jpountz.util.Utils.checkRange([BII)V
    at org.apache.kafka.common.message.KafkaLZ4BlockInputStream.read(KafkaLZ4BlockInputStream.java:176)

原因分析:

kafka-clients和spark的共同依赖lz4的版本冲突。

在kafka-clients-0.8.2.1中有两个类KafkaLZ4BlockInputStream和KafkaLZ4BlockOutputStream:


KafkaLZ4BlockInputStream中有一个read方法:


KafkaLZ4BlockOutputStream中有一个write方法:


这两个方法中所引用的net.jpountz.util.Utils类中的checkRange方法是lz4-1.2.0版本中的,在lz4-1.3.0中该方法已被移至net.jpountz.util.SafeUtils中:


Spark-2.1.1中的lz4是1.3.0版本的,所以会出现版本冲突。

解决方案:

1.建一个项目,将kafka-clients-0.8.2.1中的KafkaLZ4BlockInputStream和KafkaLZ4BlockOutputStream这两个类拷贝出来,包结构保持一致


2.将上边标红的两处代码改为:

net.jpountz.util.SafeUtils.checkRange(b, off, len);

3. 编译,将编译的.class文件替换掉对应的jar包中的文件


这样spark streaming就能正常消费kafka中的数据了。
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐