【 Spark 架构】一次 SQL 从提交到跑完的全景拆解 只讲一件事你敲下一条 SQL集群里到底发生了什么。一、先记住一张“逻辑地图”不管你用 YARN、K8s 还是 Standalone本质只有 4 层Client 提交 ↓ Cluster Manager资源调度 ↓ Spark Application ├─ Driver控制中枢 └─ Executor干活进程 ↓ Storage / Shuffle后面所有内容都是在这张图里按时间线走。假设你执行的是一条非常普通的 SQLSELECTdept_id,avg(salary)FROMempWHEREhire_date2020-01-01GROUPBYdept_id;emp是 HDFS / S3 上的 Parquet 表有 200 个文件一、提交过程第 1 步客户端只做“挂号”你运行spark-submit\--masteryarn\--num-executors10\--executor-memory 4G\sql_job.pyspark-submit本身不执行任何计算它只干三件事把你的代码、依赖、配置打包向 Cluster Manager这里是 YARN申请资源说一句话“帮我启动一个 Driver” 这一步结束任务还没开始跑连 SQL 都没解析。第 2 步Driver 启动大脑上线YARN 分配一个 Container启动Driver JVM。Driver 里几个关键角色模块干啥用SparkContext整个应用的入口DAGScheduler把 SQL / 代码变成 DAGTaskScheduler把 Task 发给 ExecutorSchedulerBackend和 YARN 沟通资源⚠️ 重要认知Driver不存业务数据Driver不算 salary、不算 avg它只负责解析、规划、调度、收状态第 3 步Executor 是“工人”Driver 向 YARN 说“我要 10 个 Executor每个 4G 内存”为什么要 10 个这是你指定的资源配额不是 Spark 算出来的。Executor 进程每个 Executor 里有很多 Task 线程真正决定“同时能跑多少活”的是并行度 Executor 数 × executor-cores例如10 Executor、每个 4 core → 最多 40 个 Task 同时跑 Executor 数量 ≠ Task 数量后面会看到 Task 远多于 10 个。Executor 启动后会向 Driver 注册“我上线了可以接活。”第 4 步SQL 在 Driver 里被“拆”1️⃣ SQL → 逻辑计划Catalyst 把 SQL 解析成一棵树Aggregate [dept_id] Project [dept_id, salary] Filter (hire_date 2020-01-01) Scan Parquet2️⃣ 优化只在 Driver 里改“计划”典型优化谓词下推WHERE hire_date 2020推到 Scan列裁剪只读dept_id, salary, hire_dateParquet 列存裁剪 这一步完全不碰数据只是把“怎么读”定好。3️⃣ 物理计划变成 Spark 算子HashAggregate └─ HashAggregate └─ Scan Parquet并决定读多少 Partition、 每个 Task 读哪一块文件关键认知Stage 为什么被切开DAGScheduler 一看计划GROUP BY dept_id→ 同一个 dept_id 必须凑到一起但数据是分散的怎么办必须 Shuffle规则有 Shuffle就切 Stage于是 DAG 被切成两段Stage 0Filter Partial AggregateMap | Shuffle | Stage 1Final AggregateReduce第五步、Stage 0 在 Executor 里到底干了啥Map Task 从哪来表有 200 个 Parquet 文件 → Stage 0 有200 个 Map TaskDriver 把这 200 个 Task 分批发给 Executor。假设 Executor 1 拿到 Task 1、Task 2。Task 内部执行流程读数据BlockManager 从 HDFS 读一个文件块优先读本地节点数据本地性Filter过滤掉hire_date 2020的员工Partial Aggregate不急着算 avg而是先算(dept_id, sum(salary), count)这是“局部汇总”第六步、ShuffleSpark 最“脏”的地方Map 端写 Shuffle每个 Map Task 不会只写一个文件而是对dept_id做 hash按 Reduce 分区写比如默认spark.sql.shuffle.partitions 200那么有 200 个 Reduce Task每个 Map Task 写 200 个小数据段Map Task 1: → Reduce 0: (dept10, sum18000, cnt2) → Reduce 1: (dept20, sum9000, cnt1) ...写的是Executor 本地磁盘。Reduce 端怎么读Reduce Task 3去所有 Map Task那里读“属于分区 3”的那一份也就是Map Task 1 → 读它的 partition 3 Map Task 2 → 读它的 partition 3 ... Map Task 200 → 读它的 partition 3✅ 所以每个 Reduce Task 会拉取所有 Map Task 的一部分数据通过网络Netty拉到内存 → 溢写磁盘 → 排序 → 聚合 Shuffle 数据不在 Driver不在 HDFS就在 Executor 的磁盘 网络里第七步、Stage 1Final AggregateStage 1 是200 个 Reduce Task。以某个 Reduce Task 为例它拉到的是同一个dept_id的所有局部 sum / countsum 18000 6000 ... count 2 1 ... avg sum / count算完后如果是SELECT→ 结果被 Driver 收集返回客户端如果是INSERT→ Executor 直接写 HDFS / 表三、把“资源”和“计算”彻底分清很多人混淆这两件事一定要拆开概念决定因素Executor 数num-executors你配的每个 Executor 能力executor-coresMap Task 数输入文件数 / Partition 数Reduce Task 数spark.sql.shuffle.partitions所以你看到的现象是10 个 Executor但 Stage 0 有 200 个 TaskExecutor 轮流接 Task跑完一个接下一个四、用一句话串完整流程你提交 SQL → YARN 启动 Driver → Driver 解析 SQL 成 DAG → 切出 Stage → 申请 Executor → Map Task 读文件、过滤、局部聚合 → 按 key 写 Shuffle → Reduce Task 跨节点拉数据 → 全局聚合 → 结果返回三个最容易误解的点记住就能秒杀面试Driver 不计算它只调度、记状态、收心跳Reduce Task 不是只拉一个 Map它拉“所有 Map 里属于自己的那一块”Executor ≠ TaskExecutor 是工人Task 是活工人少活可以很多只是排队干

相关新闻

最新新闻

东莞壁挂炉维修|过保故障专业处理|各区驻点师傅快速上门|欧米到家持证规范服务

东莞壁挂炉维修|过保故障专业处理|各区驻点师傅快速上门|欧米到家持证规范服务

【24小时报修热线:400-996-9791】欧米到家是东莞本地具备全套合规资质的壁挂炉专业维修服务商,全城分区驻点,专注家用、商用壁挂炉过保故障维修、深度除垢清洗、原厂配件更换、采暖系统调试、移机检修一站式服务。东莞冬季温和湿润&#xff0…

2026/8/16 7:13:57
Hive时间数据处理实战:从字符串转换到函数应用与性能优化

Hive时间数据处理实战:从字符串转换到函数应用与性能优化

1. 从一次数据清洗的“时间陷阱”说起最近在帮一个业务团队处理一份用户行为日志数据,他们想分析用户在不同时间段的活跃度。数据是从前端埋点直接打到HDFS上的,格式五花八门,时间戳这一列就让我开了眼:有的记录是标准的2023-10-2…

2026/8/16 7:13:57
ReAct Agent失控解析:从推理偏离到权限逃逸的深层原因与防御实践

ReAct Agent失控解析:从推理偏离到权限逃逸的深层原因与防御实践

最近在尝试把一些重复性工作交给 AI Agent 自动处理时,我遇到了一个挺典型的问题:一个原本设计用来处理文档摘要的 ReAct Agent,在连续运行了几十次后,开始“跑偏”。它不再严格遵循我设定的“读取-分析-总结”流程,而…

2026/8/16 7:13:57
SystemVerilog中ref关键字:引用传递机制、内存模型与实战应用

SystemVerilog中ref关键字:引用传递机制、内存模型与实战应用

1. 项目概述:为什么SV中的ref关键字值得深究?在SystemVerilog(SV)的世界里,数据类型和参数传递机制是构建高效、可靠验证环境与设计模型的基石。无论是刚接触SV的验证工程师,还是已经写过不少测试用例的开发…

2026/8/16 7:13:57
Figma源文件导出全攻略:从备份到交付的协作规范与避坑指南

Figma源文件导出全攻略:从备份到交付的协作规范与避坑指南

1. 项目概述:为什么“导出源文件”是Figma协作的命门?如果你在团队里用Figma做设计,迟早会碰到一个灵魂拷问:“这个设计稿的源文件能发我一下吗?” 这句话可能来自开发、产品经理,或者是需要接手你工作的另…

2026/8/16 7:13:57
从设备联网到空间理解,慢云重新定义智慧空间的技术逻辑

从设备联网到空间理解,慢云重新定义智慧空间的技术逻辑

空间AI的落地难点,从来不是让更多设备连上网。很多项目部署了大量智能门锁、照明、空调和传感器,却依然停留在“设备各自响应指令”的阶段:断网时部分功能失效,云端指令延迟影响体验,跨设备联动需要反复调试&#xff0…

2026/8/16 7:08:56