使用docker stack deploy部署Spark集群后master无法远程访问
Docker Swarm部署Bitnami Spark集群提交任务被拒绝的解决方案
问题根因
docker compose 和 docker stack deploy的网络机制存在差异,导致连接被拒绝问题,核心原因有三点:
- 缺少Spark master的对外广播地址配置:Bitnami Spark镜像默认将master的服务地址设为容器内部hostname,该地址仅能在Docker集群内部解析,外部提交任务的机器无法识别,导致master返回的回调地址不可达。
- Swarm默认Ingress网络的SNAT机制:Ingress overlay网络会对外部入站流量做源地址转换,Spark master无法获取到外部提交机器的真实IP,回包路径异常。
- 双向通信路径不通:Spark任务提交需要本地driver和集群节点双向通信,swarm默认网络配置下集群节点无法主动回连到外部的本地driver。
修复步骤
1. 修改docker-compose.yml配置
新增必要的环境变量,调整端口映射模式为host模式跳过Ingress网络的地址转换,示例配置如下(替换配置中的IP为你远程服务器的对外可访问IP):
version: '3.7' services: spark: image: bitnami/spark:3.2.0 environment: - SPARK_MODE=master - SPARK_MASTER_HOST=你的远程服务器对外IP - SPARK_MASTER_PORT=7077 ports: - target: 8080 published: 10001 protocol: tcp mode: host - target: 7077 published: 10000 protocol: tcp mode: host deploy: replicas: 1 placement: constraints: # 固定master部署在manager节点,避免服务漂移 - node.role == manager spark-worker: image: bitnami/spark:3.2.0 environment: - SPARK_MODE=worker - SPARK_MASTER_URL=spark://你的远程服务器对外IP:7077 # 可按需调整worker的资源配置 - SPARK_WORKER_MEMORY=2G - SPARK_WORKER_CORES=2 deploy: replicas: 2
2. 重新部署集群
执行以下命令重新部署swarm服务:docker stack rm spark && docker stack deploy -c docker-compose.yml spark
3. 提交任务时指定driver地址
本地提交任务时新增--driver-host参数,指定你本地机器的对外可访问IP,确保集群节点能正常回连到本地driver:
spark-submit --master spark://你的远程服务器对外IP:10000 --driver-host 你本地机器的公网IP <你的任务包路径>
注意事项
- 如果你的本地机器处于内网无公网IP,可以将任务包上传到服务器内部提交,或者配置内网穿透开放driver的通信端口。
- 确保远程服务器的10000、10001端口,以及本地driver的4040端口、随机通信端口的防火墙规则已放行。
- 多节点Swarm集群部署时,不要修改master的固定部署规则,避免服务漂移到其他节点导致IP不匹配。
内容的提问来源于stack exchange,提问作者Artin Zamani
相关产品推荐
相关产品推荐

