Spark提交Hudi程序报错:org.apache.spark.sql.adapter.Spark3Adapter类未找到
解决Spark-Submit运行Hudi Jar时的ClassNotFoundException问题
问题原因
org.apache.spark.sql.adapter.Spark3Adapter 是Hudi为适配Spark 3.x版本提供的核心类,出现找不到的异常通常是以下原因:
- Hudi版本与Spark 3.3.1不兼容
- sbt打包时未将Hudi的核心依赖(含适配类)纳入Jar包
- Spark-Submit提交时未引入Hudi的适配依赖
解决方案
1. 匹配兼容的Hudi版本
Spark 3.3.1需要搭配Hudi 0.13.0及以上版本的Spark3.3专属bundle包,在build.sbt中指定正确的依赖:
val sparkVersion = "3.3.1" val hudiVersion = "0.13.1" // 推荐使用稳定版本 libraryDependencies ++= Seq( // Spark依赖标记为Provided,避免与集群Spark依赖冲突 "org.apache.spark" %% "spark-sql" % sparkVersion % Provided, // 引入Hudi针对Spark3.3的bundle包,包含所有适配类 "org.apache.hudi" %% "hudi-spark3.3-bundle" % hudiVersion % Compile )
2. 正确打包Jar包
如果使用sbt-assembly插件打包,需确保配置中排除Spark的Provided依赖,同时包含Hudi的bundle:
在project/assembly.sbt中添加插件:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0")
在build.sbt中添加assembly配置(处理重复依赖):
assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }
执行打包命令:
sbt assembly
3. Spark-Submit提交方式
如果不想将Hudi依赖打包进Jar,也可以在提交时通过--packages直接引入:
spark-submit \ --class com.your.package.YourMainClass \ --master spark://your-spark-master:7077 \ --packages org.apache.hudi:hudi-spark3.3-bundle_2.12:0.13.1 \ path/to/your-jar-file.jar
4. 验证程序代码
确保代码中使用的是Hudi针对Spark 3.x的API,比如导入正确的Hudi类:
import org.apache.hudi.DataSourceReadOptions import org.apache.hudi.DataSourceWriteOptions import org.apache.hudi.config.HoodieWriteConfig
避免引入针对其他Spark版本的适配类(比如Spark2的adapter)。
内容的提问来源于stack exchange,提问作者pacman
相关产品推荐
相关产品推荐

