向Dataproc提交PySpark任务前,如何启用外部PostgreSQL连接?
问题描述
我有一个要提交至Dataproc的PySpark文件,代码如下:
try: print("Start writing") url = "jdbc:postgresql://some-ip:5432/postgres" properties = { "driver": "org.postgresql.Driver", "user": "postgres", "password": "root" } df.write.jdbc(url=url, table="result", mode="overwrite", properties=properties) except Exception as e: print(e) sc.stop()
使用postgresql-42.6.0.jar JDBC驱动,数据库为PostgreSQL 14。提交任务时出现连接超时错误,核心报错信息:
An error occurred while calling o86.jdbc. : org.postgresql.util.PSQLException: The connection attempt failed. ... Caused by: java.net.SocketTimeoutException: connect timed out
提交任务的命令:
gcloud beta dataproc jobs submit pyspark gs://taro-de-intern/pyspark_postgresql.py\ --cluster my-cluster \ --jars gs://my-bucket/postgresql-42.6.0.jar
已尝试降级驱动至42.4.2,修改PySpark写入JDBC的代码格式(改用.format("jdbc")链式调用),但均出现相同的连接超时错误。
解决方案
连接超时属于网络层面问题,与JDBC驱动版本、代码写法无关,按以下步骤排查解决:
1. 验证PostgreSQL的网络可达性
登录Dataproc集群的主节点,执行命令测试与目标PostgreSQL的连通性:
# 用nc测试端口连通性 nc -zv some-ip 5432 # 或用telnet测试 telnet some-ip 5432
如果命令返回连接失败/超时,说明网络不通,直接进入步骤2;如果能连通,再检查PostgreSQL的服务配置。
2. 调整PostgreSQL的访问控制
- 防火墙规则:确保PostgreSQL所在服务器的防火墙开放5432端口,并且允许Dataproc集群所在的IP段/子网访问。如果是GCP Cloud SQL,需在Cloud SQL的「连接」设置中,添加Dataproc集群的公网IP或VPC网络到授权列表。
- PostgreSQL配置文件:
修改postgresql.conf,设置listen_addresses = '*'(允许所有IP访问,或指定Dataproc集群的IP段),重启PostgreSQL服务。
修改pg_hba.conf,添加允许Dataproc集群IP段的访问规则,例如:
重启PostgreSQL使配置生效。host all all <dataproc-subnet-cidr>/24 md5
3. 检查Dataproc集群的网络配置
- 如果PostgreSQL部署在私有网络中,确保Dataproc集群与PostgreSQL在同一个VPC,或已配置VPC peering。
- 若使用GCP Cloud SQL,优先采用私有IP连接,避免公网传输的不稳定;或在Dataproc集群中部署Cloud SQL Auth Proxy代理连接,提升连通性与安全性。
4. 排查中间网络障碍
- 检查是否有企业级防火墙、代理服务器阻止了Dataproc集群的出站请求到5432端口。
- 确认PostgreSQL服务处于运行状态,且监听端口为默认的5432(可通过
netstat -tulpn | grep 5432验证)。
内容的提问来源于stack exchange,提问作者Wasin Phaijith
相关产品推荐
相关产品推荐

