Docker上的Spark集群无法通过Bastion连接AWS RDS PostgreSQL
Spark作业连接localhost:5555被拒绝的排查方案
确认SSM端口转发的监听地址
SSM默认的端口转发只会监听127.0.0.1,但Spark Worker容器的localhost和Master容器的localhost是完全独立的网络空间。- 执行
netstat -tulpn | grep 5555查看Master容器内的监听地址,如果输出是127.0.0.1:5555,说明只有Master自身能访问这个端口,Worker容器根本连不上。 - 重新启动SSM转发时要加上
--bind-address 0.0.0.0参数,让端口监听容器的所有网卡:aws ssm start-session --target <你的EC2实例ID> --document-name AWS-StartPortForwardingSession --parameters '{"portNumber": ["5432"], "localPortNumber": ["5555"], "bindAddress": ["0.0.0.0"]}'
- 执行
检查Spark作业的JDBC连接配置
作业里的JDBC URL不能写localhost:5555,因为Worker容器访问的是自己的localhost,不是Master容器的。要改成指向Master容器的服务名(Docker Compose里定义的服务名,比如spark-master):jdbc:postgresql://spark-master:5555/你的数据库名验证容器间的网络连通性
进入任意一个Worker容器,执行以下命令测试能否连通Master的5555端口:nc -zv spark-master 5555 # 或者用telnet telnet spark-master 5555如果连接失败,检查Docker Compose的网络配置,确保Master和Worker在同一个自定义网络中,没有被隔离。
确认Master容器内的端口转发有效性
在Master容器内直接用psql测试连接,确认SSM转发本身是正常的:psql -h localhost -p 5555 -U 你的数据库用户名 -d 你的数据库名如果这里能正常连接,说明问题出在容器间的网络或者作业配置上;如果这里也连不上,那要排查SSM会话的权限、RDS的安全组是否允许SSM代理EC2的访问。
检查Master容器的防火墙规则
有些基础镜像默认开启了iptables,可能会拦截5555端口的入站请求。执行iptables -L查看规则,必要时添加开放规则:iptables -A INPUT -p tcp --dport 5555 -j ACCEPT
内容的提问来源于stack exchange,提问作者Eya
相关产品推荐
相关产品推荐

