PySpark使用mongodb-spark连接器报错:类未找到com.mongodb.spark.sql.DefaultSource
踩过类似的坑,结合你给出的版本(MongoDB Connector 2.2.2、Spark 2.2.0、MongoDB 3.6),这个类未找到的问题大概率是Spark运行时没有正确加载MongoDB连接器的依赖包,下面是具体的解决步骤:
1. 用spark-submit指定依赖包(最推荐)
如果你是通过spark-submit运行Python脚本,一定要在命令里加上--packages参数来引入连接器依赖,命令格式如下:
spark-submit --packages org.mongodb.spark:mongo-spark-connector_2.11:2.2.2 /home/cisco/spark-mongo-test.py
注意:
_2.11对应Scala版本,Spark 2.2.0默认使用Scala 2.11,如果你Spark是基于Scala 2.10编译的,就改成_2.10。这个参数会自动下载匹配的依赖包并添加到Spark的classpath里。
如果是用pyspark交互式shell运行,启动时也要带上这个参数:
pyspark --packages org.mongodb.spark:mongo-spark-connector_2.11:2.2.2
2. 检查代码中的数据源配置(辅助验证)
虽然这不是类找不到的直接原因,但确保代码里的数据源格式和配置正确很重要,比如读取数据时需要指定MongoDB的连接信息:
df = spark.read.format("com.mongodb.spark.sql.DefaultSource") \ .option("uri", "mongodb://localhost:27017/your_db.your_collection") \ .load()
这里的uri要替换成你实际的MongoDB地址、数据库和集合名。
3. 手动添加jar包到Spark的lib目录(可选)
如果不想每次运行都加--packages参数,可以手动下载对应版本的mongo-spark-connector jar包(注意匹配Scala版本),放到Spark安装目录下的jars文件夹里,然后重启Spark服务。这样Spark每次启动时都会自动加载这个jar包,不用再手动指定依赖。
为什么会出现这个错误?
ClassNotFoundException本质是Spark的JVM进程在运行时找不到com.mongodb.spark.sql.DefaultSource这个类,而这个类是MongoDB Spark Connector提供的。之所以安装时正常但运行时出错,是因为安装的包没有被Spark的运行环境识别到,必须通过--packages或者手动添加jar包的方式把依赖加入Spark的classpath才行。
内容的提问来源于stack exchange,提问作者Piyush Chitkara

