Spark Streaming Kafka集成运行报NoClassDefFoundError: InputDStream求助
Spark Streaming Kafka 程序类加载错误排查
错误本质
你遇到的java.lang.NoClassDefFoundError: org/apache/spark/streaming/dstream/InputDStream错误,本质是运行程序的类路径中没有找到Spark Streaming核心类。当JVM校验主类合法性时,如果发现主类依赖的核心类缺失,就会连带抛出Error: A JNI error has occurred提示。
这个问题和应用名配置、本地Spark/Kafka服务安装都没有关系——你单独启动Kafka、Spark服务正常,只代表服务端进程自身的类加载没有问题,不代表你自己开发的应用程序在运行时加载到了所有需要的依赖。
具体问题定位
build.sbt中依赖作用域配置错误
你给spark-streaming依赖标记了provided作用域:libraryDependencies += "org.apache.spark" %% "spark-streaming" % "3.1.1" % "provided"provided作用域的规则是:依赖仅参与编译阶段,不会被打包进最终应用jar,默认由运行时的集群环境提供该类。你现在是本地直接启动主程序,没有通过spark-submit加载集群侧的Spark依赖,运行时类路径里根本不存在InputDStream类,就会触发类加载异常。- 程序本身缺少启动逻辑
就算类加载问题解决,当前代码只定义了DStream转换逻辑,没有触发作业启动、流式计算执行的代码,程序启动后也不会真正消费Kafka数据。
修复步骤
- 调整本地运行场景下的依赖配置
本地调试阶段去掉spark-streaming依赖的provided标记,保证依赖能被加载到本地运行类路径。如果后续要将作业提交到Spark集群运行,再把provided标记加回即可(避免和集群自带的Spark依赖冲突)。调整后的配置参考:name := "KafkaSpark" version := "0.1" scalaVersion := "2.12.13" libraryDependencies += "org.apache.spark" %% "spark-streaming" % "3.1.1" libraryDependencies += "org.apache.spark" %% "spark-streaming-kafka-0-10" % "3.1.1" - 选择正确的本地启动方式
不要直接用纯Java命令、IDEA直接右键运行的方式启动程序,依赖配置调整完成后,在sbt shell中执行run命令启动,sbt会自动将所有配置的依赖加载到运行类路径中,避免类找不到的问题。 - 补全Streaming程序的执行逻辑
在现有代码末尾补上作业启动逻辑,让流式计算真正运行:// 打印流中收到的数据 stream.map(record => (record.key, record.value)).print() // 启动Streaming上下文,阻塞等待作业终止 ssc.start() ssc.awaitTermination()
内容的提问来源于stack exchange,提问作者Миша Попов
相关产品推荐
相关产品推荐

