
摘要Spark Standalone 集群的 Master 节点是资源调度的核心一旦宕机整个集群陷入瘫痪。Master HA 通过 ZooKeeper 实现 Active-Standby 多 Master 架构支持自动故障切换和状态恢复。本文从 ZooKeeperLeaderElectionAgent 选主原理、Active/Standby 角色行为、三种恢复模式ZooKeeper/FILESYSTEM/NONE对比、完整配置与启动流程四个维度配合 2 张架构图彻底解析 Spark Master HA 的高可用机制。关键词Spark Master HA, ZooKeeper, Leader Election, Active-Standby, 恢复模式, PersistenceEngine, Failover一、开篇Master 单点故障的致命性在 Spark Standalone 集群中Master 是绝对的调度中心——它负责接收 Worker 注册、管理资源、调度 Driver 和 Application。一旦唯一的 Master 宕机Master 宕机后的连锁反应 ├── 所有 Worker 失去心跳目标 → 自动退出 ├── Running Applications → 继续运行但不可调度新任务 ├── 新 Driver/Application 提交 → 全部失败 ├── 集群状态信息 → 不可查询且不可恢复默认 NONE 模式 └── 唯一恢复方式 → 重启 Master 全部 Worker 重新注册Master HAHigh Availability正是为解决这一单点问题而生。核心思路多个 Master 节点 ZooKeeper 协调选举任一宕机自动切换。二、Master HA 架构全景2.1 角色分工Active Master(Leader)├── 接收 Worker 注册与心跳 ├── 调度 Driver/Application ├── 资源分配、端口管理 ├── 写 PersistenceEngine(ZK)└── 定期更新 ZK/leader_election 临时节点 Standby Master(Follower)├── 监听 ZK/leader_election 变化 ├── PersistenceEngine 只读 ├── 不处理 Worker 心跳 └── 随时准备接管30s2.2 ZK 选主流程① 每个 Master 启动 → 连接 ZK 集群 ② 在 /spark_master/leader_election 下创建临时顺序节点 ③ 序号最小的节点 → 成为 Active MasterLeader ④ 其他 Master → Standby设置 Watcher 监听前序节点 ⑤ Active Master 宕机 → 临时节点自动删除 → ZK 通知 ⑥ 序号次小的 Standby 感知 → 立即竞选 → 成为新 Active三、恢复模式深度对比3.1 重量级对比ZooKeeper FILESYSTEM NONE ────────────────────────────────────────────────────────────────── 多 Master ✅ ActiveN Standby ❌ 仅单Master ❌ 自动 Failover ✅ (30s) ❌ 需手动重启 ❌ 状态恢复 ✅ 完整恢复 ⚠️ 同节点恢复 ❌ 全部丢失 PersistenceEngine ZooKeeperPE FileSystemPE BlackHolePE LeaderElectionAgent ZKLeaderElection MonarchyLeader MonarchyLeader 生产推荐 ✅ 强烈推荐 ⚠️ 小规模过渡 ❌ 仅开发3.2 FILESYSTEM 的局限性FILESYSTEM 模式不是真正的高可用——它仅支持 Master 重启后从文件系统恢复状态无法实现多 Master 自动切换。适用场景单 Master 测试环境或需保留完成状态但不需要连续服务的过渡方案。3.3 CUSTOM 自定义模式RECOVERY_MODECUSTOM 实现 StandaloneRecoveryModeFactory 接口 → 自定义 LeaderElectionAgent → 自定义 PersistenceEngine → 可接入 etcd/Consul/自研选举系统四、完整配置与启动4.1 spark-env.sh 配置# 每个 Master 节点的 spark-env.shexportSPARK_MASTER_HOSTmaster-1# 当前节点 IPexportSPARK_MASTER_PORT7077exportSPARK_MASTER_WEBUI_PORT8080# ZK HA 配置所有 Master 节点相同exportSPARK_DAEMON_JAVA_OPTS -Dspark.deploy.recoveryModeZOOKEEPER -Dspark.deploy.zookeeper.urlzk1:2181,zk2:2181,zk3:2181 -Dspark.deploy.zookeeper.dir/spark_master 4.2 启动集群# ZK 集群先启动zkServer.sh start# 所有 ZK 节点# Master 节点 $SPARK_HOME/sbin/start-master.sh# master-1 (Active)$SPARK_HOME/sbin/start-master.sh# master-2 (Standby)$SPARK_HOME/sbin/start-master.sh# master-3 (Standby)# Worker 节点 # 指向所有 Master 地址以自动发现 Active$SPARK_HOME/sbin/start-worker.sh spark://master-1:7077,master-2:7077,master-3:70774.3 验证 HA 状态# 查看 Active Mastercurlhttp://master-1:8080/json/|python3-mjson.tool|grepstatus# ZK 中查看选主状态zkCli.sh-serverzk1:2181ls/spark_master/leader_election# 临时节点列表get /spark_master/status# Active Master 地址# 模拟 Failover停掉 Active Masterkill$(jps|grepMaster|awk{print $1})# → 观察 Standby 在 30s 内自动接管五、核心源码追踪ZooKeeperLeaderElectionAgent// 源码: org.apache.spark.deploy.master.ZooKeeperLeaderElectionAgentclassZooKeeperLeaderElectionAgent(valmaster:LeaderElectable,conf:SparkConf)extendsLeaderElectionAgent{valWORKING_DIRconf.get(ZOOKEEPER_DIRECTORY)/leader_election// 创建临时顺序节点valznodezk.create(WORKING_DIR/member_,master.address.getBytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL)// 获取所有候选节点排序后最小的为 LeaderdefupdateLeader():Unit{valchildrenzk.getChildren(WORKING_DIR,true).sortedvalmasterAddresszk.getData(WORKING_DIR/children.head)master.electedLeader()// 或 master.revokedLeadership()}}PersistenceEngine 接口// 源码: org.apache.spark.deploy.master.PersistenceEnginetraitPersistenceEngine{defpersist(name:String,obj:Object):Unit// 持久化defunpersist(name:String):Unit// 删除defread[T:ClassTag](prefix:String):Seq[T]// 读取所有// 内置实现:// ZooKeeperPersistenceEngine → 写入 ZK ZNodes// FileSystemPersistenceEngine → 写入本地/HDFS 文件// BlackHolePersistenceEngine → 丢弃所有数据NONE 模式}六、总结Master HA 核心多 Master ZK 临时顺序节点选主。Active 负责全部调度工作并写 PersistenceEngineStandby 只读等待接管通过 ZK Watcher 感知 Leader 变更。三种恢复模式ZOOKEEPER生产首选完整 HA、FILESYSTEM单节点恢复非真正 HA、NONE默认仅限开发。配置要点所有 Master 共享相同spark.deploy.zookeeper.url和spark.deploy.zookeeper.dirWorker 和 Client 指向所有 Master 地址以自动发现 Active。作者starzy博客blog.starzy.cnGitHubstarzy1990.github.io专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践