You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:54:03