使用Spark RDD API读取Kafka数据时出现NoSuchMethodError问题求助
Spark RDD API读取Kafka数据时出现NoSuchMethodError问题求助
嘿,我帮你梳理下这个问题的根源和解决办法哈~
从你贴的栈追踪信息来看,核心错误是java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.poll(Ljava/time/Duration;)Lorg/apache/kafka/clients/consumer/ConsumerRecords;,这个问题的本质是Spark Streaming Kafka模块依赖的Kafka客户端版本,和你实际使用的Kafka 1.1.0客户端版本不兼容。
问题根源
Spark 3.3.1配套的spark-streaming-kafka-0-10模块,是基于Kafka 2.x版本的客户端API开发的——这个版本的KafkaConsumer新增了poll(Duration)方法;而你使用的Kafka 1.1.0版本的客户端,poll方法还是用long类型的超时毫秒数作为参数,根本没有poll(Duration)这个方法。当程序运行时,类加载器加载了旧版本的Kafka客户端类,就会抛出找不到方法的错误。
解决办法
你不需要升级Kafka集群版本(Kafka客户端是向前兼容的,新版本客户端可以连接旧版本集群),只需要调整项目依赖的Kafka客户端版本,和Spark保持兼容即可:
- 对齐Spark与Kafka客户端版本
Spark 3.3.1官方推荐兼容的Kafka客户端版本是2.8.1,你可以把项目中的Kafka客户端依赖改成这个版本:
- 如果用Maven,修改
pom.xml:
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.8.1</version> </dependency>
- 如果用SBT,修改
build.sbt:
libraryDependencies += "org.apache.kafka" % "kafka-clients" % "2.8.1"
- 排除Spark自带的冲突依赖
有时候Spark的依赖包中已经自带了kafka-clients,可能和你手动引入的版本冲突,这时候需要排除Spark自带的版本,再引入指定版本:
比如Maven中:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.3.1</version> <exclusions> <exclusion> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.8.1</version> </dependency>
- 提交作业时指定依赖(集群运行场景)
如果是在Spark集群上提交作业,建议用--packages参数直接指定兼容的依赖版本,避免环境中的旧jar包干扰:
spark-submit --packages org.apache.spark:spark-streaming-kafka-0-10_2.12:3.3.1,org.apache.kafka:kafka-clients:2.8.1 your-app.jar
另外还要确认你的spark-streaming-kafka-0-10依赖版本和Spark版本完全一致(都是3.3.1),版本不匹配也会导致类似的兼容性问题哦~
备注:内容来源于stack exchange,提问作者Augusto Lemius
相关产品推荐
相关产品推荐

