PySpark(Dataproc)连接MongoDB/Atlas时出现连接超时错误
排查PySpark连接MongoDB超时/连接拒绝问题
核心问题分析
报错明确显示尝试连接localhost:27017时被拒绝,本地及GCP Dataproc环境均出现该问题,说明要么MongoDB未在该地址运行,要么代码配置的连接地址错误,或是网络连通性存在障碍。
逐步排查解决方法
确认MongoDB实例的实际地址
- 若使用远程MongoDB(如GCP Cloud MongoDB、云服务器自建Mongo),绝对不能用
localhost作为连接地址,需替换为MongoDB实例的公网IP、内网IP(同VPC环境下用内网更稳定)或主机名。 - 本地环境需确认:MongoDB是否真的监听在
localhost:27017,有没有修改过默认端口。
- 若使用远程MongoDB(如GCP Cloud MongoDB、云服务器自建Mongo),绝对不能用
验证网络连通性
- 本地环境:打开终端执行
mongosh localhost:27017,若连不上说明Mongo未启动或端口错误;也可使用telnet localhost 27017或nc -zv localhost 27017测试端口是否开放。 - Dataproc集群:先登录主节点
gcloud compute ssh custom-cluster-no-address-m --region us-west1,再执行telnet <mongodb-host> 27017或nc -zv <mongodb-host> 27017,若不通则检查MongoDB所在服务器的防火墙规则,或是GCP的VPC防火墙是否允许Dataproc集群的IP段访问27017端口。 - 若是GCP Cloud MongoDB,需确认是否配置了VPC peering,或是是否在Mongo的网络白名单中添加了Dataproc集群的IP范围。
- 本地环境:打开终端执行
检查PySpark代码的连接配置
- 确保代码中的MongoDB URI配置正确,示例如下:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("MongoSparkDemo") \ # 替换为你的MongoDB实际地址、用户名密码、库和集合 .config("spark.mongodb.input.uri", "mongodb://username:password@mongo-host:27017/db_name.collection_name") \ .config("spark.mongodb.output.uri", "mongodb://username:password@mongo-host:27017/db_name.collection_name") \ .getOrCreate() - 若Mongo开启了认证,不要遗漏用户名密码;除非确实在本地节点运行Mongo,否则不要使用默认的
mongodb://localhost:27017。
- 确保代码中的MongoDB URI配置正确,示例如下:
检查MongoDB的运行和监听配置
- 本地环境:检查Mongo服务状态,比如Linux下执行
systemctl status mongod,Windows在服务列表中查看MongoDB是否启动。 - 查看Mongo配置文件(如Linux的
/etc/mongod.conf),确认net.bindIp设置为0.0.0.0(允许所有IP访问),若设置为127.0.0.1则仅能本地访问,外部无法连接。 - 确认MongoDB所在服务器的防火墙未拦截27017端口。
- 本地环境:检查Mongo服务状态,比如Linux下执行
检查依赖兼容性
mongo-spark-connector版本必须与Spark、MongoDB版本匹配:10.0.x版本对应Spark 3.3.x和MongoDB 5.0/6.0,需确认你的Dataproc集群Spark版本(如Dataproc 2.1.x使用Spark 3.3.x是兼容的)。- 无需手动指定
mongodb-driver-core和mongodb-driver-sync,connector本身会依赖这些包,手动添加可能导致版本冲突,建议仅提交mongo-spark-connector-10.0.5.jar尝试。
内容的提问来源于stack exchange,提问作者Saranya
相关产品推荐
相关产品推荐

