spark-submit运行PySpark读写Mongo报ClassNotFoundException错误求助
错误原因
你遇到的java.lang.ClassNotFoundException: com.mongodb.spark.sql.DefaultSource错误,核心是Spark集群运行时没有加载到MongoDB Spark连接器依赖,本地能跑是因为本地模式下代码中声明的依赖配置会在进程启动时生效,集群模式下存在以下差异:
- 配置优先级问题:
spark.jars.packages写在SparkSession代码中时,优先级低于spark-submit命令行参数,集群调度启动Executor进程时还未读取到代码内的配置,类路径初始化完成后再配置已经无法生效。 - 版本不匹配:你当前使用的连接器版本
org.mongodb.spark:mongo-spark-connector_2.11:2.3.2是基于Scala 2.11编译、适配Spark 2.3.x的版本,若你提交任务的集群Spark版本为3.x、或Scala版本为2.12,就会出现类不兼容无法加载的问题。 - 集群依赖拉取失败:使用
packages参数时所有Worker节点需要能访问公共Maven仓库下载依赖包,若集群为离线环境、或限制外网访问,就无法正常下载连接器包。
解决方案
- 优先将依赖配置移至spark-submit命令行中提交,示例如下:
# 先执行spark-submit --version确认集群的Scala版本、Spark版本,替换尖括号内的内容 spark-submit --packages org.mongodb.spark:mongo-spark-connector_<Scala版本>:<匹配Spark版本的连接器版本> 你的脚本名.py
版本匹配参考:
- Spark 2.3.x + Scala 2.11 可保留你当前使用的
org.mongodb.spark:mongo-spark-connector_2.11:2.3.2 - Spark 3.0.x + Scala 2.12 对应
org.mongodb.spark:mongo-spark-connector_2.12:3.0.1 - Spark 3.2及以上版本建议使用10.x以上系列的连接器
- 若集群无法访问外网,提前下载对应版本的MongoDB Spark连接器jar包及Mongo Java驱动包,上传到所有Worker节点的Spark/jars目录,或提交时通过--jars参数指定本地路径:
spark-submit --jars /本地路径/mongo-spark-connector.jar,/本地路径/mongo-java-driver.jar 你的脚本名.py
- 额外注意:集群运行时MongoDB连接地址不能写
127.0.0.1,需替换为MongoDB服务对外可访问的IP或域名,否则Worker节点无法正常连接数据库。
内容的提问来源于stack exchange,提问作者Th333w1
相关产品推荐
相关产品推荐

