Spark 核心之 Executor 与线程池原理剖析

简介: 本文深度剖析 Spark Executor 内部机制:从 CoarseGrainedExecutorBackend 通信、固定大小线程池与 TaskRunner 执行流程,到 UnifiedMemoryManager 内存管理、BlockManager 存储体系,结合源码与架构图,带你透彻理解这一核心计算单元。(239字)

摘要:如果 Driver 是 Spark 的大脑,Executor 就是它的计算引擎。一个 Executor 是一个独立的 JVM 进程,内部通过固定大小的线程池并发执行 Task。本文从 Executor 内部架构全景、CoarseGrainedExecutorBackend 通信层、线程池模型与 TaskRunner 执行引擎、UnifiedMemoryManager 内存管理、BlockManager 存储体系五个维度,配合 1 张原创深色架构图 + 完整源码级分析,带你彻底看清 Executor 的内部世界。

关键词:Spark Executor, TaskRunner, ThreadPoolExecutor, TaskMemoryManager, BlockManager, CoarseGrainedExecutorBackend, Shuffle, 线程池


一、开篇:Executor 是什么?

# 一个 Executor 就是一个 JVM 进程
# spark.executor.cores=4 意味着这个 JVM 内有 4 个线程同时运行 Task
--executor-memory 8G \
--executor-cores 4

Executor 是 Spark 的计算执行单元,它承载了以下核心职责:

职责 说明
接收 Task 从 Driver 接收序列化的 Task 对象
反序列化 + 执行 反序列化闭包 → 执行 RDD 算子逻辑
内存管理 TaskMemoryManager + UnifiedMemoryManager
数据存储 BlockManager (MemoryStore + DiskStore)
Shuffle 服务 写 Shuffle 数据、服务远程读取
结果回传 序列化结果 → StatusUpdate → Driver

二、Executor 内部架构全景图

在这里插入图片描述

三、CoarseGrainedExecutorBackend:通信层

// 源码:CoarseGrainedExecutorBackend.scala
class CoarseGrainedExecutorBackend(
    driverUrl: String, executorId: String, hostname: String,
    cores: Int, ...)
  extends ThreadSafeRpcEndpoint {

  override def onStart(): Unit = {
    // 🔑 反向注册到 Driver
    rpcEnv.asyncSetupEndpointRefByURI(driverUrl).flatMap { ref =>
      driver = Some(ref)
      ref.ask[Boolean](RegisterExecutor(executorId, self, hostname, cores, ...))
    }
  }

  // 接收 Driver 指令
  override def receive: PartialFunction[Any, Unit] = {
    case LaunchTask(data) => executor.launchTask(this, data)  // 启动 Task
    case KillTask(taskId, ...) => executor.killTask(taskId, ...)
    case StopExecutor => ...
  }
}

四、线程池模型 🔥

4.1 Executor 的线程池初始化

// 源码:Executor.scala
private[executor] class Executor(
    executorId: String, executorHostname: String,
    env: SparkEnv, ...) extends Logging {

  // 固定大小线程池 — 大小 = spark.executor.cores
  private val threadPool = {
    val threadFactory = new ThreadFactoryBuilder()
      .setDaemon(true)
      .setNameFormat("Executor task launch worker-%d")
      .build()
    Executors.newFixedThreadPool(executorCores, threadFactory)
  }
  // 等价于 new ThreadPoolExecutor(corePoolSize, corePoolSize, ...)
}

关键特征:固定大小线程池,corePoolSize = maxPoolSize = spark.executor.cores。

4.2 TaskRunner:Task 执行体

// 源码:Executor.scala - TaskRunner
class TaskRunner(execBackend: ExecutorBackend, taskDescription: TaskDescription)
  extends Runnable {

  override def run(): Unit = {
    // === Step 1: 反序列化 Task ===
    val ser = SparkEnv.get.closureSerializer.newInstance()
    val task = ser.deserialize[Task[Any]](taskDescription.serializedTask)

    // === Step 2: 设置 TaskMemoryManager ===
    val taskMemoryManager = new TaskMemoryManager(env.memoryManager, taskId)

    // === Step 3: 执行 Task ===
    val res = task.run(taskAttemptId, taskMemoryManager, ...)

    // === Step 4: 序列化结果 ===
    val resultSer = SparkEnv.get.serializer.newInstance()
    val serializedResult = resultSer.serialize(new DirectTaskResult(res))

    // === Step 5: 回传 Driver ===
    execBackend.statusUpdate(taskId, TaskState.FINISHED, serializedResult)
  }
}

4.3 Task 提交到线程池

def launchTask(context: ExecutorBackend, taskDescription: TaskDescription): Unit = {
  val tr = new TaskRunner(context, taskDescription)
  runningTasks.put(taskDescription.taskId, tr)
  threadPool.execute(tr)  // 提交到固定大小线程池
}

五、内存管理

5.1 UnifiedMemoryManager

┌─────────────────────────────────────────┐
│         UnifiedMemoryManager            │
│  ┌───────────────┐  ┌────────────────┐  │
│  │ExecutionMemory │  │ StorageMemory  │  │
│  │   (执行 60%)    │  │  (存储 40%)    │  │
│  │ Shuffle 缓冲区  │  │ RDD 缓存       │  │
│  └───────────────┘  └────────────────┘  │
│         ↕ 动态占用/淘汰 (spill to disk)   │
└─────────────────────────────────────────┘
// TaskMemoryManager 为每个 Task 提供独立的内存管理
val taskMemoryManager = new TaskMemoryManager(env.memoryManager, taskId)
// 从 ExecutionMemoryPool 申请内存
val page = taskMemoryManager.allocatePage(size, consumer)

六、BlockManager 存储体系

组件 职责
BlockManager Executor 级存储管理(Memory + Disk)
MemoryStore 内存存储(LinkedHashMap,LRU 淘汰)
DiskStore 磁盘存储(Shuffle 文件、RDD 缓存溢出)
BlockManagerMaster 在 Driver 端管理全局 Block 元数据
ExternalShuffleService 独立守护进程,Executor 退出后仍可服务 Shuffle 读取

七、Executor 配置调优

spark-submit \
  --executor-memory 8G \             # Executor JVM 堆内存
  --executor-cores 4 \               # 线程池大小 = 4
  --conf spark.executor.memoryOverhead=1G \  # 堆外内存
  --conf spark.memory.fraction=0.6 \         # 执行+存储占比
  --conf spark.memory.storageFraction=0.5 \  # 存储占 memoryFraction 的比例
  --conf spark.shuffle.service.enabled=true \ # 外部 Shuffle 服务
  my-app.jar

八、总结

要点 总结
Executor 本质 一个运行 CoarseGrainedExecutorBackend 的 JVM 进程
线程池 固定大小 ThreadPoolExecutor,大小 = spark.executor.cores
TaskRunner 反序列化 → 内存初始化 → 执行 → 序列化结果 → StatusUpdate
内存 UnifiedMemoryManager 统一管理执行+存储内存
存储 BlockManager: MemoryStore + DiskStore + Shuffle 服务

金句:如果说 Driver 是 Spark 的 CEO(制定策略、分配任务),Executor 就是 Spark 的工程师——它不关心 DAG 如何切分,只专注于把手头的每一个 Task 高效执行到底。



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

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

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

目录
相关文章
|
2天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1199 0
|
25天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9576 32
|
11天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
9天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
779 1
|
6天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
515 0
|
23天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2598 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
存储 人工智能 自然语言处理
千问办公官网入口链接在哪?2026年最新QwenWork测评、千问办公怎么样?一文看懂
千问办公(QwenWork)是阿里云推出的AI智能办公平台,提供网页端和阿里云官网双入口。支持PPT/Word/Excel生成、多模态处理、网页全栈搭建、钉钉深度集成等6大核心能力。个人版免费可用,高级版198元/月;企业版198元/人/月。新用户注册即赠2000积分。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
1002 0
|
16天前
|
Windows
【保姆级】.NET Framework 3.5离线安装教程(2026最新实测)
.NET Framework 3.5是微软经典运行库,专为兼容老软件、老游戏设计。Win7自带,Win10/11需手动启用(在线或离线安装)。它与4.x系列并存不冲突,缺它会导致“找不到组件”报错。本文详解两种安装方式及常见问题解决,小白也能轻松上手。(239字)
2187 0