Google Cloud Dataproc集群下PySpark DataFrame写入MongoDB报错如何解决
PySpark 写入 MongoDB 报错排查方案
1 核心版本兼容问题修复
Spark 2.4.7 默认基于 Scala 2.11 版本编译,你当前引入的 MongoDB Spark 连接器是 Scala 2.12 编译版本,版本不兼容是最常见的报错原因:
- 修正 SparkSession 中依赖配置的坐标,将原来的
org.mongodb.spark:mongo-spark-connector_2.12-2.4.3替换为org.mongodb.spark:mongo-spark-connector_2.11:2.4.3 - 注意 Maven 坐标格式为
groupId:artifactId:version,Scala 版本标识在 artifactId 中用下划线后缀标注,三段参数用冒号分隔。
2 连接串配置修正
你当前使用的 MongoDB+srv 格式连接串存在错误:
- SRV 连接格式无需手动指定 27017 端口,SRV 记录会自动解析 MongoDB 集群的地址和端口
- 若 MongoDB 开启了身份认证,需要在连接串中补充用户名和密码信息
- 修正后的连接串参考格式:
mongodb+srv://<你的用户名>:<你的密码>@my_host/people_db
3 Dataproc 集群依赖加载校验
如果集群为内网环境无法访问公网 Maven 仓库,spark.jars.packages 自动下载依赖会失败:
- 提前将对应版本的 MongoDB 连接器 Jar 包上传到 Google Cloud Storage 或者集群本地路径
- 提交作业时通过
--jars <Jar包路径>参数显式指定依赖,保证所有 Executor 节点都能加载到正确的依赖包。
4 写入代码简化优化
MongoDB Spark 连接器 2.4.x 版本支持短名格式的数据源标识,可简化写入代码降低配置错误概率:
df.write \ .format("mongo") \ .mode("append") \ .option("database", "people_db") \ .option("collection", "people") \ .save()
进阶排查思路
如果完成以上修改后仍报错,可直接查看 YARN 上对应作业的 Executor 运行日志:
- 若日志提示
ClassNotFoundException/NoClassDefFoundError,说明依赖加载仍存在问题,需要排查 Jar 包版本和分发逻辑 - 若日志提示
ConnectionTimeout/SocketTimeout,说明网络连通性异常,需要检查 Dataproc 集群到 MongoDB 实例的网络策略、IP 白名单配置 - 若日志提示
AuthenticationFailed/PermissionDenied,说明账号权限配置错误,需要校验连接串中的账号密码、以及对应账号的数据库写入权限。
内容的提问来源于stack exchange,提问作者Walid
相关产品推荐
相关产品推荐

