Spark 核心之 Master 原理剖析

简介: Spark Master是Standalone集群的“指挥中心”,负责Worker注册与心跳、Driver/Executor资源调度(基于SpreadOutApps算法)、应用生命周期管理,并通过ZooKeeper实现主备选举与状态恢复,确保高可用。(239字)

摘要:Spark Master 是 Standalone 模式的"集群大脑"。它管理所有 Worker 的注册与心跳,调度 Driver 和 Application 的资源分配,通过 SpreadOutApps 算法确保负载均衡,借助 ZooKeeper 实现主备选举和状态恢复。本文从 Master 内部架构全景、核心数据结构、schedule() 调度引擎源码、Worker 生命周期管理、HA 高可用机制五个维度,配合 1 张原创深色架构图 + 完整源码分析,带你彻底看清 Master 的内部世界。

关键词:Spark Master, schedule(), Worker 管理, 资源调度, SpreadOutApps, HA, ZooKeeper, LeaderElection, PersistenceEngine


一、开篇:Master 是什么?

如果说 Driver 是单个应用的"大脑",那么 Master 就是整个 Standalone 集群的"指挥中心"。

职责 说明
Worker 管理 注册、心跳、超时检测、资源登记
资源调度 Driver 调度 + Application Executor 资源分配
应用生命周期 注册 → 排队 → 调度 → 完成 → 移除
HA 高可用 ZK 主备选举、状态持久化、故障自动切换

一句话定位:Master 不执行 Task,不做 DAG 解析——它只做一件事:谁需要资源、谁有资源、把资源分给谁。


二、Master 内部架构全景图

在这里插入图片描述

Master 四大核心模块

┌────────────────────────────────────────────┐
│                 Spark Master               │
│  ┌──────────────┐  ┌──────────────────┐    │
│  │ 核心数据结构   │  │  schedule() 引擎  │    │
│  │ workers: Set  │  │ SpreadOutApps    │    │
│  │ apps: Set     │  │ FIFO/FAIR 策略   │    │
│  │ drivers: Set  │  │ launchExecutor() │    │
│  └──────────────┘  └──────────────────┘    │
│  ┌──────────────┐  ┌──────────────────┐    │
│  │ RPC Endpoint  │  │   HA 高可用       │    │
│  │ RegisterWorker│  │ LeaderElection   │    │
│  │ RegisterApp   │  │ PersistenceEngine│    │
│  │ Heartbeat     │  │ 状态恢复          │    │
│  └──────────────┘  └──────────────────┘    │
└────────────────────────────────────────────┘

三、核心数据结构

// 源码:Master.scala
private[master] class Master(
    override val rpcEnv: RpcEnv,
    address: RpcAddress,
    webUiPort: Int,
    val securityMgr: SecurityManager,
    val conf: SparkConf)
  extends ThreadSafeRpcEndpoint {

  // === 核心数据结构 ===
  val workers = new HashSet[WorkerInfo]          // 已注册的 Worker
  val apps = new HashSet[ApplicationInfo]        // 运行中的应用
  val drivers = new HashSet[DriverInfo]          // 已提交的 Driver (Cluster 模式)

  // === 等待队列 ===
  val waitingApps = new ArrayBuffer[ApplicationInfo]   // 等待资源分配的应用
  val waitingDrivers = new ArrayBuffer[DriverInfo]     // 等待 Worker 的 Driver

  // === 已完成的应用(数量限制,用于 Web UI 展示)===
  private val completedApps = new ArrayBuffer[ApplicationInfo]
  private val completedDrivers = new ArrayBuffer[DriverInfo]
}
数据结构 类型 用途
workers HashSet 所有已注册的 Worker
apps HashSet 运行中的 Application
drivers HashSet Cluster 模式提交的 Driver
waitingApps ArrayBuffer 排队等待资源分配的应用
waitingDrivers ArrayBuffer 排队等待 Worker 的 Driver

四、schedule() 调度引擎 🔥

这是 Master 最核心的方法——每次状态变更都会触发调用。

// 源码:Master.scala - schedule() 核心逻辑
private def schedule(): Unit = {
  // Step 1: 先调度 Driver (Cluster 模式)
  for (driver <- waitingDrivers.toList) {
    val worker = workers.filter(_.state == WorkerState.ALIVE)
      .filter(canLaunchDriver(_, driver.desc)).headOption
    worker.foreach { w =>
      waitingDrivers -= driver
      w.endpoint.send(LaunchDriver(driver.id, driver.desc))
      driver.state = DriverState.RUNNING
    }
  }

  // Step 2: 再调度 Application (Executor 分配)
  startExecutorsOnWorkers()
}

4.1 SpreadOutApps 负载均衡算法

// 源码:startExecutorsOnWorkers()
private def startExecutorsOnWorkers(): Unit = {
  for (app <- waitingApps if app.coresLeft > 0) {
    val usableWorkers = workers.filter(_.state == WorkerState.ALIVE)
      .filter(canLaunchExecutor(_, app.desc))

    // SpreadOut: 尽可能将 Executor 分散到不同 Worker
    // 每个 Worker 分配尽可能少的 cores(最少 1 个 Executor)
    val numWorkers = usableWorkers.length
    var coresPerWorker = app.desc.maxCores.getOrElse(Int.MaxValue) / numWorkers
    if (coresPerWorker < 1) coresPerWorker = 1

    for (worker <- usableWorkers if app.coresLeft > 0) {
      val coresToUse = math.min(worker.coresFree, coresPerWorker)
      launchExecutor(worker, app, coresToUse)
    }
  }
}

SpreadOut 策略的优势:将任务分散到更多节点 → 更高的数据本地性命中率 → 减少 Shuffle 网络开销。


五、Worker 生命周期管理

Worker 启动 → RegisterWorker → Master 登记 → Heartbeat (每 15s)
                                         ↓
                                    超时未心跳?
                                   /         \
                                 NO           YES
                              继续运行     RemoveWorker
                                            ↓
                                        状态标记 DEAD
                                        waitingApps 重新排队
                                        apps 中的 Executor 失联
// Worker 心跳超时检测
case Heartbeat(workerId, worker) =>
  worker.lastHeartbeat = System.currentTimeMillis()
  // 15 秒超时检查在 checkForWorkerTimeOuts() 中

级联效应:Worker 宕机 → RemoveWorker → 释放的资源重新进入 schedule() → 其他 Worker 承接任务。


六、Master HA:ZooKeeper 主备选举

# 启动 HA Master 集群
# Master 1
./sbin/start-master.sh -h master-1 --webui-port 8080 \
  --conf spark.deploy.recoveryMode=ZOOKEEPER \
  --conf spark.deploy.zookeeper.url=zk1:2181,zk2:2181,zk3:2181

# Master 2 (备)
./sbin/start-master.sh -h master-2 --webui-port 8080 \
  --conf spark.deploy.recoveryMode=ZOOKEEPER \
  --conf spark.deploy.zookeeper.url=zk1:2181,zk2:2181,zk3:2181

6.1 选举机制

// 源码:ZooKeeperLeaderElectionAgent.scala
class ZooKeeperLeaderElectionAgent(val masterInstance: LeaderElectable,
    conf: SparkConf, securityMgr: SecurityManager, zkUrl: String)
  extends LeaderElectionAgent {

  // 在 ZK 创建临时顺序节点 /spark/leader_election/lock-0000000xxx
  // 序号最小的节点成为 Leader
  // Leader 宕机 → 临时节点自动删除 → 下一个最小序号成为新 Leader
}

6.2 状态持久化与恢复

// 恢复模式
sealed trait RecoveryMode
case object ZOOKEEPER extends RecoveryMode
case object FILESYSTEM extends RecoveryMode  // 本地文件系统
case object CUSTOM extends RecoveryMode      // 自定义实现
case object NONE extends RecoveryMode        // 无 HA

恢复流程:新 Leader 从持久化存储读取 → 恢复 workers/apps/drivers 状态 → 执行 schedule() 继续调度。


七、总结

要点 总结
定位 Master = 集群资源调度中心,不执行 Task/DAG
核心方法 schedule():Driver + Executor 资源分配
调度策略 SpreadOutApps 分散负载 + FIFO/FAIR 排队
数据结构 workers/apps/drivers/waitingApps/waitingDrivers
HA ZK 临时节点选举 + 持久化状态恢复

金句:如果 Driver 是单个应用的大脑,Master 就是整个集群的交管中心——它不跑车,但它决定哪辆车走哪条路。



作者:starzy | AI Data Engineer / 大数据技术实践者

博客:blog.starzy.cn | GitHub:starzy1990.github.io

专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践

目录
相关文章
|
4天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1233 3
|
27天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9725 32
|
13天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
8天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
12天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
880 1
|
5天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
570 1
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
|
8天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
574 0
|
9天前
|
存储 人工智能 自然语言处理
千问办公官网入口链接在哪?2026年最新QwenWork测评、千问办公怎么样?一文看懂
千问办公(QwenWork)是阿里云推出的AI智能办公平台,提供网页端和阿里云官网双入口。支持PPT/Word/Excel生成、多模态处理、网页全栈搭建、钉钉深度集成等6大核心能力。个人版免费可用,高级版198元/月;企业版198元/人/月。新用户注册即赠2000积分。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
1156 0