Spark 核心之任务调度角色划分以及资源调度角色划分详解

摘要 :为什么 DAGScheduler 从不关心集群用的是 Standalone 还是 YARN?为什么 Master 从不关心 DAG 怎么切?这背后是 Spark 架构中最精妙的设计------任务调度与资源调度的完美解耦。Driver 端只管"算什么、怎么算"(DAG→Stage→Task),集群端只管"在哪算、给多少资源"(分配 Executor)。本文从两大调度体系全景、三层任务调度链、三层资源调度链、角色交互时序、三种部署模式映射五个维度,配合 1 张原创深色架构图 + 完整源码分析,带你看清 Spark 调度体系的角色划分。

关键词:Spark 任务调度, 资源调度, DAGScheduler, TaskScheduler, Master, Worker, SchedulerBackend, ClusterManager


一、开篇:一句话说清两大调度体系

makefile 复制代码
任务调度(Driver 端):  算什么 + 怎么算 → DAGScheduler → TaskScheduler → SchedulerBackend
资源调度(集群端):      在哪算 + 给多少资源 → ClusterManager → Master/RM → Worker/NM

核心设计哲学 :Driver 不管集群用什么(Standalone/YARN/K8s),集群不管 Driver 怎么切 DAG。两者通过 SchedulerBackend 这个适配器通信。


二、全景架构图


三、任务调度侧:三层链(全部在 Driver JVM)

Layer 1: DAGScheduler --- Stage 切分者

scala 复制代码
// 职责: RDD Lineage → Stage DAG → TaskSet
def handleJobSubmitted(jobId: Int, finalRDD: RDD[_], ...) {
  val finalStage = createResultStage(finalRDD, ...)
  submitStage(finalStage)  // 递归提交(先父后子)
}

Layer 2: TaskScheduler --- Task 分发者

scala 复制代码
// 职责: TaskSet → 数据本地性排序 → 匹配 Executor
def submitTasks(taskSet: TaskSet) {
  val manager = new TaskSetManager(this, taskSet)
  schedulableBuilder.addTaskSetManager(manager)
  backend.reviveOffers()  // 通知 Backend 有 Task 可调度
}

Layer 3: SchedulerBackend --- 集群通信者

scala 复制代码
// 职责: 与集群通信 → 匹配空闲 Executor → 发送 Task
def reviveOffers() {
  driverEndpoint.send(ReviveOffers)
}
// StandaloneSchedulerBackend → Master RPC
// YarnSchedulerBackend      → AM → RM
// KubernetesSchedulerBackend → K8s API Server

四、资源调度侧:三层链(独立守护进程)

Layer 1: ClusterManager --- 集群入口

实现 canHandle 资源池
StandaloneClusterManager spark:// Master + Workers
YarnClusterManager yarn RM + NM + Container
KubernetesClusterManager k8s:// API Server + Pod

Layer 2: Master / RM --- 调度决策者

scala 复制代码
// Master.schedule() 核心逻辑
private def schedule(): Unit = {
  // ① 先调度 Driver (Cluster 模式)
  for (driver <- waitingDrivers) { launchDriverOnWorker(driver) }
  // ② 再调度 Executor
  startExecutorsOnWorkers()  // SpreadOutApps 负载均衡
}

Layer 3: Worker / NM --- 资源执行者

bash 复制代码
Master 指令 → Worker.receive(LaunchExecutor)
  → ProcessBuilder("java", "CoarseGrainedExecutorBackend", ...)
  → coresFree -= cores · memoryFree -= memory
  → 监控子进程 exit → 回收资源

五、两大体系的交互时序

scss 复制代码
Driver 端                    集群端
───────                     ──────
new SparkContext()           Master/RM 就绪
  ↓
DAGScheduler 就绪            RegisterApplication
  ↓                              ↓
TaskScheduler 就绪            schedule() → 分配 Executor
  ↓                              ↓
SchedulerBackend 就绪 ←── 反向注册 → Executor 启动
  ↓
Action → DAG → Stage         资源状态更新
  ↓
submitMissingTasks()
  ↓
reviveOffers → launchTasks ──→ Executor 执行
  ↓
statusUpdate ←──────────────  Task 完成
  ↓
sc.stop() → KillExecutors → 资源回收

六、三种部署模式角色映射

角色 Standalone YARN Kubernetes
ClusterManager StandaloneClusterManager YarnClusterManager K8sClusterManager
资源调度者 Master ResourceManager API Server
资源执行者 Worker NodeManager kubelet
资源载体 Executor (JVM) Container → Executor Pod → Executor
TaskScheduler TaskSchedulerImpl TaskSchedulerImpl / YarnClusterScheduler TaskSchedulerImpl
SchedulerBackend StandaloneSchedulerBackend YarnSchedulerBackend K8sSchedulerBackend

七、总结

要点 总结
任务调度 Driver 端 · DAGScheduler→TaskScheduler→SchedulerBackend
资源调度 集群端 · ClusterManager→Master/RM→Worker/NM
解耦点 SchedulerBackend 是适配器 · TaskScheduler 是纯逻辑
映射 三种部署模式替换资源调度层,任务调度层保持不变

金句:Spark 把"计算逻辑"(DAG/Stage/Task)和"资源管理"(CPU/内存/节点)完全解耦------这就是为什么同一个 Job 可以在 Standalone、YARN、K8s 上无差异运行的根本原因。


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

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

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

相关推荐
xianghongtao01162 分钟前
麦肯锡2026技术趋势04_AI基础设施与模型架构_研究解读
大数据·人工智能·架构
A 杨乐1821005189112 分钟前
2027第十三届中国国际养老服务业博览会
大数据·人工智能
ShawnLiaoking42 分钟前
ADS305 Big Data Lecuture4 Web Scraping
大数据·前端
计算机毕业编程指导师1 小时前
【计算机毕设选题】基于Hadoop+Spark的化妆品销售数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·spark·课程设计·化妆品
奈落241 小时前
DeepSeek Harness 开源贡献手记:从 Issue 认领到 PR 合入的完整实践
大数据·人工智能·安全·搜索引擎·开源
码艺-Alimjan1 小时前
Tauri 项目 和 Vben-Admin 项目 源码打包哲学
大数据·elasticsearch·搜索引擎
计算机毕业设计杰瑞1 小时前
【精品大数据项目】基于大数据的药品多维度属性分析与可视化的设计与实现,附源码_数据可视化_数据分析_毕设选题推荐_SPark_Hadoop_文档指导ppt
大数据·信息可视化·数据分析
samFuB1 小时前
【数据集】地市健康城市与公共卫生响应文本分析词频数据(2005-2025年)
大数据
人工智能培训2 小时前
数字孪生驱动大模型工业知识库:为具身机器人植入领域专业经验
大数据·linux·服务器·前端·人工智能
W***25922 小时前
2026年企业级Work Agent品类科普
大数据