spark程序消费kafka数据报错:java.lang.NoSuchMethodError: net.jpountz.util.Utils.checkRange([BII)V

本文介绍了解决Spark 2.1.1与Kafka 0.8版本间因lz4库引起的版本冲突问题的方法。冲突源于Kafka-clients与Spark对lz4的不同版本依赖。文章提供了一个详细的解决方案,通过修改Kafka-clients中的源代码来适配更高的lz4版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中的数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值