docker部署spark是本地多节点开发测试环境,非生产集群;需分设master/worker容器、同网络互通,推荐docker-compose配3.5.x版本,通过spark://spark-master:7077提交作业。

使用 Docker 容器部署 Spark 并不意味着直接运行一个“生产级分布式集群”,而是快速搭建可验证的本地多节点环境或轻量级开发/测试平台。关键在于理解 Spark 的角色划分(Master/Worker)和容器间网络通信机制,避免常见误区(如仅用单容器运行 spark-shell 就认为是“部署”)。
明确部署目标:单机多容器模拟集群
Docker 本身不是为跨主机调度设计的,所以典型做法是在一台宿主机上启动多个容器,分别承担 Spark Master、多个 Worker 和可选的 Web UI 或提交客户端角色。这适合学习原理、调试作业、CI 测试等场景。
- Master 容器负责集群协调和资源调度
- 每个 Worker 容器注册到 Master,提供 CPU/内存资源执行任务
- 所有容器需在同一 Docker 网络中,确保通过服务名互通
- Spark 版本建议选 3.5.x 或 3.4.x(稳定且对 Java 17 支持好)
使用 docker-compose 快速编排
比手动 run 多个容器更可靠。以下是一个最小可用的 docker-compose.yml 示例(基于官方镜像 apache/spark:3.5.0):
version: '3.8'
services:
spark-master:
image: apache/spark:3.5.0
container_name: spark-master
command: bin/spark-class org.apache.spark.deploy.master.Master -h spark-master
ports:
- "8080:8080" # Web UI
- "7077:7077" # Master RPC port
networks:
- spark-net
<p>spark-worker-1:
image: apache/spark:3.5.0
container_name: spark-worker-1
command: bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077
depends_on:</p>
- spark-master environment:
- SPARK_WORKER_CORES=2
- SPARK_WORKER_MEMORY=2g networks:
- spark-net
spark-worker-2: image: apache/spark:3.5.0 container_name: spark-worker-2 command: bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077 depends_on:
- spark-master environment:
- SPARK_WORKER_CORES=2
- SPARK_WORKER_MEMORY=2g networks:
- spark-net
networks:
spark-net:
driver: bridge
保存后执行:
docker-compose up -d
稍等几秒,访问 http://localhost:8080 即可看到 Master UI,确认两个 Worker 已上线。
向集群提交应用(非本地模式)
不能直接在宿主机用 spark-submit 提交(默认走 local[*] 模式)。有三种实用方式:
-
进入 Master 容器提交:
docker exec -it spark-master bash
然后运行:./bin/spark-submit --master spark://spark-master:7077 examples/src/main/python/pi.py -
新建 client 容器(推荐):添加一个服务,复用相同镜像,但 command 设为
sleep infinity,然后 exec 进去提交——更干净,避免污染 Master 容器 -
从宿主机提交(需网络可达):确保宿主机能解析
spark-master(例如改 hosts 或用 Docker DNS),并确认 7077 端口映射正确(注意:Spark Worker 默认绑定内部 IP,不建议直接映射 Worker 端口)
注意事项与常见问题
部署成功不等于稳定可用,以下细节容易出错:
- Java 版本一致性:官方镜像用 Java 17,若你本地代码依赖 Java 8,需自建镜像或降级 Spark 版本
-
Worker 内存配置:
SPARK_WORKER_MEMORY是 Worker 进程总内存上限,实际 Executor 内存由提交时--executor-memory控制,两者需匹配 -
文件路径问题:容器内没有你的本地代码或数据文件。要么挂载卷(
volumes: ./myapp:/opt/myapp),要么把 jar 打包进自定义镜像 - 不适用于生产:Docker Swarm/Kubernetes 才是生产部署方案;此方式无高可用(Master 单点)、无持久化存储、无资源隔离保障










