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包中的文件