Spark Structured Streaming连接Kafka遇NoSuchMethodError问题求助
NoSuchMethodError 解决方案建议 环境信息
- Spark 3.3.1
- Scala 2.12.15
- Hadoop 3.3.4
- Kafka 3.3.1
错误信息
java.lang.NoSuchMethodError: org.apache.spark.kafka010.KafkaTokenUtil$.needTokenUpdate(Ljava/util/Map;Lscala/Option;)
后续关联异常:
StreamingQueryException: Query [id = 600dfe3b-6782-4e67-b4d6-97343d02d2c0, runId = 197e4a8b-699f-4852-a2e6-1c90994d2c3f] terminated with exception: Writing job aborted
相关代码
读取Kafka Topic代码
result_1 = spark.readStream \ .format("kafka") \ .option("kafka.bootstrap.servers", "localhost:9092") \ .option("subscribe", "sampleTopic1") \ .option("startingOffsets", "latest") \ .load()
输出到控制台代码
trans_detail_write_stream = result_1 \ .writeStream\ .trigger(processingTime='1 seconds')\ .outputMode("update")\ .option("truncate", "false")\ .format("console")\ .start()\ .awaitTermination()
执行命令
spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.3.1 streamer.py
解决方案建议
这个报错本质是依赖版本冲突或组件兼容性不匹配,以下是针对性解决步骤:
排查环境依赖冲突
检查Spark安装目录的jars文件夹,是否存在多个版本的Kafka相关jar包(如kafka-clients-*.jar、spark-sql-kafka-0-10_*.jar)。如果有,删除旧版本,只保留与你指定的3.3.1版本匹配的文件。强制隔离冲突依赖
在spark-submit命令中添加排除参数,避免加载环境中自带的冲突Kafka组件:spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.3.1 --exclude-org org.apache.kafka streamer.py修复输出模式兼容性问题
你当前使用的update输出模式需要配合聚合操作或明确的更新逻辑,而从Kafka读取的原始DataFrame(仅包含key/value/topic等基础字段)不满足该模式的要求。建议改为append模式直接打印原始数据:trans_detail_write_stream = result_1 \ .writeStream\ .trigger(processingTime='1 seconds')\ .outputMode("append")\ # 修改为append模式 .option("truncate", "false")\ .format("console")\ .start()\ .awaitTermination()强制拉取匹配依赖
如果本地Maven仓库存在损坏的依赖,添加仓库参数强制从中央仓库拉取正确版本:spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.3.1 --repositories https://repo1.maven.org/maven2/ streamer.py
内容的提问来源于stack exchange,提问作者Muhammad Affan

