Spark Structured Streaming集成Kafka时ClassNotFoundException问题求助
解决Spark Structured Streaming集成Kafka时的ClassNotFoundException问题
问题场景
在Ubuntu系统上进行Spark Structured Streaming与Kafka、Cassandra的集成开发,执行以下spark-submit命令时出现报错:
spark-submit --class StreamHandler --master local[*] --packages "org.apache.spark:spark-sql-kafka-0-10_2.12:3.2.3" target/scala-2.12/stream-handler_2.12-1.0.jar
报错信息:
causedby:java.lang.ClassNotFoundException:org.apache.kafka.common.serialization.ByteArraySerializer at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 24 more
使用的版本信息:
- Spark:spark-3.2.3-hadoop2.7
- Scala:2.12.15
- Kafka:kafka_2.12-2.8.0
- SBT:sbt-1.9.1
解决方案
1. 补充Kafka客户端依赖到spark-submit命令
spark-sql-kafka-0-10包依赖Kafka客户端组件,但默认不会自动拉取对应版本的kafka-clients包,导致缺失ByteArraySerializer类。需在--packages参数中添加与你的Kafka服务器版本匹配的客户端依赖:
spark-submit --class StreamHandler --master local[*] --packages "org.apache.spark:spark-sql-kafka-0-10_2.12:3.2.3,org.apache.kafka:kafka-clients:2.8.0" target/scala-2.12/stream-handler_2.12-1.0.jar
这里指定kafka-clients:2.8.0与你的Kafka服务器版本一致,确保兼容性。
2. 检查并完善SBT项目依赖
如果项目构建阶段就存在依赖缺失,修改build.sbt文件,明确引入Kafka客户端依赖:
libraryDependencies ++= Seq( "org.apache.spark" %% "spark-sql-kafka-0-10" % "3.2.3" % Provided, "org.apache.kafka" % "kafka-clients" % "2.8.0" )
标记spark-sql-kafka-0-10为Provided是因为Spark集群环境已包含该包,避免运行时冲突;kafka-clients需要明确引入以确保编译和运行时都能找到相关类。
3. 确认版本兼容性
Spark 3.2.3对应的spark-sql-kafka-0-10包兼容Kafka客户端2.8.x版本,与你使用的Kafka 2.8.0服务器版本匹配,不会出现版本不兼容问题。
内容的提问来源于stack exchange,提问作者UTHAYAKUMAR M
相关产品推荐
相关产品推荐

