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

Docker环境下Spark Master与Spark Worker容器通信故障求助

Docker环境下Spark Master与Worker容器通信问题解决

问题概述

在Docker环境搭建Spark分布式集群时,Spark Worker容器无法连接到Spark Master,报错如下:

Caused by: java.io.IOException: Failed to connect to spark-master:7077
Caused by: java.net.UnknownHostException: spark-master

项目结构

repo-project/
.
├── dns
├── docker
│   ├── cloudera
│   │   ├── docker-compose.yml
│   │   └── Dockerfile
│   ├── grafana
│   │   ├── docker-compose.yml
│   │   └── Dockerfile
│   ├── mongodb
│   │   ├── docker-compose.yml
│   │   └── Dockerfile
│   ├── spark
│   │   ├── docker-compose.yml
│   │   └── Dockerfile
│   └── spark-worker
│       ├── docker-compose.yml
│       ├── Dockerfile
│       └── spark-worker.sh
├── docker-compose.yml
├── LICENSE
├── README.md
├── requirements.txt
└── src
    ├── application.py
    ├── logs
    └── Tools
        ├── __init__.py
        ├── __init__.pyc
        ├── __pycache__
        │   ├── __init__.cpython-310.pyc
        │   ├── __init__.cpython-311.pyc
        │   ├── Tools.cpython-310.pyc
        │   └── Tools.cpython-311.pyc
        └── Tools.py

已尝试方案

  • 验证容器是否处于同一Docker网络
  • 确保Spark Worker中正确配置了Spark Master的地址
  • 确认Spark Master和Spark Worker容器在同一个Docker Compose中

相关配置文件

根目录docker-compose.yml

version: '3'
services:
  cloudera:
    build: ./docker/cloudera
    container_name: cloudera
    hostname: quickstart.cloudera
    ports:
      - "7180:7180"
      - "8088:8088"
      - "19888:19888"
      - "50070:50070"
      - "8888:8888"
      - "8082:8080"
      - "18088:18088"
    environment:
      - CLUSTER_NAME=cluster
      - SERVICES=hdfs,hive,spark
    networks:
      - network-docker


  spark-master:
    build: ./docker/spark
    container_name: spark-master
    hostname: spark-master
    ports:
      - "8080:8080"
      - "4040:4040"
    environment:
      - SPARK_MODE=master
      - SPARK_MASTER_NAME=spark-master
      - SPARK_MASTER_UI_PORT=8080
      - SPARK_LOG_DIR=/opt/spark/logs
    depends_on:
      - cloudera
    networks:
      - network-docker

  spark-worker:
    image: bde2020/spark-worker:latest
    container_name: spark-worker
    hostname: spark-worker
    ports:
      - "8081:8081"
    environment:
      - SPARK_MODE=worker
      - SPARK_MASTER=spark://spark-master:7077
      - SPARK_WORKER_CORES=1
      - SPARK_WORKER_MEMORY=1G
      - SPARK_MASTER_UI_PORT=8080
      - SPARK_LOG_DIR=/opt/spark/logs
    depends_on:
      - spark-master
    networks:
      - network-docker

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    networks:
      - network-docker

  mongodb:
    image: mongo:latest
    container_name: mongodb
    ports:
      - "27017:27017"
    networks:
      - network-docker

networks:
  network-docker:
    driver: bridge

docker/spark/docker-compose.yml

version: '3'
services:
  spark-master:
    build: .
    container_name: spark-master
    hostname: spark-master
    ports:
      - "8080:8080"
      - "4040:4040"
    environment:
      - SPARK_MODE=master
      - SPARK_MASTER_NAME=spark-master
      - SPARK_MASTER_UI_PORT=8080
      - SPARK_LOG_DIR=/opt/spark/logs

  spark-worker:
    image: bde2020/spark-worker:latest
    container_name: spark-worker
    hostname: spark-worker
    ports:
      - "8081:8081"
    environment:
      - SPARK_MODE=worker
      - SPARK_MASTER=spark://spark-master:7077
      - SPARK_WORKER_CORES=1
      - SPARK_WORKER_MEMORY=1G

docker/spark/Dockerfile

FROM bde2020/spark-master:latest

COPY ./ /opt/spark-app/

# Exponha as portas necessárias
EXPOSE 8080 7077 4040

# Inicie o master do Spark
CMD ["/bin/bash", "/spark/bin/spark-class org.apache.spark.deploy.master.Master"]

解决方案

1. 暴露Spark Master的7077端口并明确端口配置

在根目录docker-compose.yml的spark-master服务中,添加7077端口映射,并明确指定Master端口环境变量:

spark-master:
  build: ./docker/spark
  container_name: spark-master
  hostname: spark-master
  ports:
    - "8080:8080"
    - "4040:4040"
    - "7077:7077"  # 新增端口映射
  environment:
    - SPARK_MODE=master
    - SPARK_MASTER_NAME=spark-master
    - SPARK_MASTER_UI_PORT=8080
    - SPARK_MASTER_PORT=7077  # 新增端口指定
    - SPARK_LOG_DIR=/opt/spark/logs
  depends_on:
    - cloudera
  networks:
    - network-docker

2. 修正Spark Master的启动命令

bde2020/spark-master镜像自带/master.sh启动脚本,会自动配置Master的网络参数。修改docker/spark/Dockerfile,移除自定义CMD,使用镜像默认启动逻辑:

FROM bde2020/spark-master:latest

COPY ./ /opt/spark-app/

# Exponha as portas necessárias
EXPOSE 8080 7077 4040

# 移除原CMD,使用镜像默认启动脚本

若需自定义启动,也可改为:

CMD ["/bin/bash", "/master.sh"]

3. 避免重复定义容器

根目录和docker/spark子目录的docker-compose.yml均定义了同名的spark-master和spark-worker容器,启动时会导致冲突。建议仅使用根目录的docker-compose.yml管理所有服务,删除子目录的docker-compose.yml或避免启动它。

4. 验证网络连通性

进入Spark Worker容器,执行以下命令验证是否能解析Spark Master:

docker exec -it spark-worker ping spark-master

若无法解析,重启Docker网络服务:

sudo systemctl restart docker

或重新创建自定义网络:

docker network rm network-docker
docker network create network-docker

内容的提问来源于stack exchange,提问作者Felipe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:45:57