PySpark连接本地MongoDB创建Spark Session报ClassNotFoundException如何解决
PySpark 连接本地 MongoDB 标准实现方案
报错核心原因
两次类不存在报错均由两个共性问题导致:
- 版本兼容匹配不符合要求:Spark 生态的第三方数据源连接器需要和 Spark 版本、内置 Scala 版本严格对应
- 依赖拉取失败:
spark.jars.packages配置会默认从 Maven 中央仓库拉取依赖包,网络环境问题导致拉取失败时也会触发类找不到异常
当前测试环境(PySpark 3.1.2、MongoDB 5.0.2、Python 3.8.8)本身无兼容性问题,按照如下标准方案实现即可正常运行。
标准实现代码
from pyspark.sql import SparkSession # 初始化 Spark Session spark = SparkSession.builder \ .master("local[*]") \ .appName("MongoConnectTest") \ .config("spark.mongodb.input.uri", "mongodb://127.0.0.1:27017/mydb.coll") \ .config("spark.mongodb.output.uri", "mongodb://127.0.0.1:27017/mydb.coll") \ # 适配 Spark 3.1.x + Scala 2.12 的 Mongo 连接器版本 .config("spark.jars.packages", "org.mongodb.spark:mongo-spark-connector_2.12:3.0.1") \ .getOrCreate() # 读取数据验证 df = spark.read.format("mongo").load() # 打印表结构 df.printSchema() # 打印前5行数据 df.show(5)
异常情况处理
如果运行后仍然报类找不到错误,说明依赖包自动拉取失败,可通过手动加载本地 Jar 包解决:
- 手动下载两个依赖包:
mongo-spark-connector_2.12-3.0.1.jar、mongo-java-driver-3.12.11.jar,存放至本地任意目录 - 将上述代码中的
spark.jars.packages配置替换为spark.jars,值为两个 Jar 包的本地绝对路径,多个路径用英文逗号分隔:# Windows 路径示例 .config("spark.jars", "C:/dependency/mongo-spark-connector_2.12-3.0.1.jar,C:/dependency/mongo-java-driver-3.12.11.jar") # macOS/Linux 路径示例 .config("spark.jars", "/home/user/dependency/mongo-spark-connector_2.12-3.0.1.jar,/home/user/dependency/mongo-java-driver-3.12.11.jar")
常见踩坑原因说明
PySpark 连接 MongoDB 看起来操作简单但容易出错,核心原因是 Spark 本身基于 Scala 开发,第三方数据源连接器同时依赖 Scala 版本、Spark 版本、数据源版本三个维度的匹配,和普通 Python 包仅需适配 Python 版本的规则不同,任意一个版本不匹配都会触发运行时异常。另外国内网络环境下 Maven 中央仓库访问不稳定,也会导致自动拉取依赖经常失败,进一步提升了使用门槛。
内容的提问来源于stack exchange,提问作者PBG
相关产品推荐
相关产品推荐

