spark-submit提交作业报ClassNotFoundException找不到hudi数据源
问题描述
读取Hudi数据时抛出如下异常:
Caused by: java.lang.ClassNotFoundException: Failed to find data source: hudi. Please find packages at http://spark.apache.org/third-party-projects.html
同一集群下,Jupyter Notebook中运行以下Scala代码可正常读取Hudi数据:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder.config( "spark.sql.catalogImplementation", "hive" ).config( "spark.serializer", "org.apache.spark.serializer.KryoSerializer" ).enableHiveSupport().getOrCreate import org.apache.hudi.DataSourceReadOptions val hudiIncQueryDF = spark.read.format("hudi").load( "path" ) import org.apache.spark.sql.functions._ hudiIncQueryDF.filter(col("column_name")===lit("2022-06-01")).show(10,false)
集群初始化时已经配置全局参数:
--properties spark:spark.jars="gs://rdl-stage-lib/hudi-spark3-bundle_2.12-0.10.0.jar" \
但使用spark-submit提交同逻辑作业时固定抛出上述类找不到错误,已在作业配置中添加spark.serializer=org.apache.spark.serializer.KryoSerializer参数,仍无法解决。
根因分析
- 集群层面配置的
spark.jars参数仅对交互式作业会话(Jupyter、spark-shell、pyspark等启动时默认继承集群全局Spark配置的场景)生效。spark-submit提交批作业时,会优先加载提交命令中指定的配置,默认不会继承全局的spark.jars配置,导致Hudi的核心依赖包没有被加载到作业运行时的classpath中,因此找不到hudi数据源实现。 spark.serializer配置为Kryo只是Hudi运行的必要配置项,不负责加载Hudi的依赖类,仅配置该参数无法解决类缺失问题。
修复方案
三选一即可:
- 提交作业时显式指定Hudi依赖包路径,和集群全局配置的包保持一致即可:
spark-submit \ --conf spark.jars="gs://rdl-stage-lib/hudi-spark3-bundle_2.12-0.10.0.jar" \ --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ # 其余原有提交参数,比如主类、作业jar包、业务参数等 - 若不想每次提交都重复写jar路径,可以将对应版本的
hudi-spark3-bundle_2.12-0.10.0.jar上传到集群所有节点的Spark安装目录下的jars文件夹中,Spark启动时会自动加载该目录下的所有依赖,无需额外配置。 - 提交时通过
--packages参数自动拉取对应版本依赖,注意版本必须和集群环境匹配(Spark3、Scala2.12、Hudi0.10.0),示例参数:spark-submit \ --packages org.apache.hudi:hudi-spark3-bundle_2.12:0.10.0 \ --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ # 其余提交参数
排查提示:如果配置完依赖后仍报相同错误,先确认提交作业使用的账号有权限访问对应存储路径下的Hudi依赖包,避免权限问题导致依赖拉取失败。
内容的提问来源于stack exchange,提问作者radhika sharma
相关产品推荐
相关产品推荐

