摘要:如果说 Client 模式是开发者的"调试利器",那么 Cluster 模式就是生产环境的"定海神针"。Driver 不再运行在你的笔记本上,而是被 Master 调度到集群 Worker 节点——spark-submit 提交完即可退出,应用完全脱离客户端独立运行。本文从整体架构、11 步启动流程、ClientApp 短连接机制、supervise 自动重启四个维度,配合 2 张原创深色架构图和完整源码分析,带你彻底吃透 Standalone-Cluster 模式的每一个细节。
关键词:Spark Standalone, Cluster 模式, DriverWrapper, ClientApp, Master, Worker, Executor, supervise, 生产环境调度
一、开篇:为什么你需要 Cluster 模式?
在上一篇文章中,我们深度拆解了 Client 模式。如果你还记得的话,Client 模式有一个致命缺陷:
spark-submit 进程不能退出——因为它就是 Driver。
这意味着:
- 你的笔记本合上盖子 → 任务中断
- 网络断开 → 任务中断
- 终端被关闭 → 任务中断
在生产环境、定时任务、CI/CD 流水线中,这是完全不可接受的。
# Cluster 模式:提交完即可退出
spark-submit \
--master spark://master:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 4G \
--total-executor-cores 8 \
my-app.jar
# ← 提交完成后 spark-submit 进程立即退出
# ← Driver 在集群 Worker 节点上独立运行
# ← 你的笔记本可以关机了
Cluster 模式的核心哲学是:将 Driver 的运行也交给集群管理,实现完全的去客户端化。本文将详细讲解这一模式的设计原理、启动流程和最佳实践。
二、Cluster 模式整体架构
2.1 角色模型
Cluster 模式新增了一个关键角色——ClientApp,同时改变了 Driver 的生命周期管理模式:
| 角色 | Client 模式位置 | Cluster 模式位置 | 核心变化 |
|---|---|---|---|
| spark-submit | 就是 Driver,必须存活 | 短连接,提交后退出 | 🔥 最核心区别 |
| ClientApp | 不存在 | spark-submit fork 的子进程 | 负责注册 + 等待结果 |
| Driver | 提交客户端 JVM | Worker 节点上的 DriverWrapper | 🔑 位置迁移 |
| Master | 资源调度 | 资源调度 + Driver 调度 | 新增 Driver 调度 |
| Worker | 启动 Executor | 启动 DriverWrapper + Executor | 新增 Driver 托管 |
| Executor | Worker 子进程 | Worker 子进程(同 Client) | 无变化 |
2.2 整体架构图

三个关键设计要点:
-
ClientApp 是短连接进程:它只负责向 Master 注册应用、等待 Driver 启动成功,收到成功通知后立即退出。与之对应,Client 模式的 spark-submit 需要全程存活。
-
DriverWrapper 是 Worker 托管进程:Master 选择一个满足条件的 Worker,指令其 fork 出 DriverWrapper JVM 进程。这个进程内部初始化 SparkContext,扮演 Driver 角色。
-
spark-submit → ClientApp → Master → Worker → DriverWrapper 是一条完整的责任链,任何一环失败都会导致应用提交失败。
三、Cluster 模式 vs Client 模式:一张表彻底搞清
| 对比维度 | Client 模式 | Cluster 模式 |
|---|---|---|
| Driver 运行位置 | 提交客户端 JVM | Worker 节点 DriverWrapper JVM |
| spark-submit 生命周期 | 贯穿整个 Job | 提交后立即退出 |
| 中间代理 | 无(直接创建 SparkContext) | ClientApp 子进程 |
| 日志查看 | 控制台直接可见 | spark-submit --status 或 Web UI |
| 网络要求 | Driver ↔ 全部 Executor 互通 | 集群内部闭环,不需要客户端连通 |
| Driver HA | 不支持(客户端挂了就是挂了) | 支持 --supervise 自动重启 |
| 适用场景 | 开发调试、交互式分析 | 生产环境、定时任务、CI/CD |
| 提交方式 | spark-shell / spark-submit --deploy-mode client | spark-submit --deploy-mode cluster |
四、Cluster 模式启动流程:12 步深度拆解
这是本文最核心的章节。我们用一张完整的消息时序图 + 12 步源码追踪来拆解。

4.1 Phase 1:spark-submit fork ClientApp
Step 1 — spark-submit 判断 deployMode
// 源码:SparkSubmit.scala
if (args.isStandaloneCluster


487

被折叠的 条评论
为什么被折叠?



