尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【 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 是活工人少活可以很多只是排队干
RELATED

相关推荐

Python中list()与map()函数的核心原理、性能对比与实战应用

Python中list()与map()函数的核心原理、性能对比与实战应用

1. 从两个“老朋友”的日常误解说起在Python的日常开发里,list()和map()绝对是两个高频出现的“老朋友”。但有意思的是,我见过不少开发者,包括一些有一定经验的同行,对它们的理解和使用常常停留在“知其然”的层面。比如&#xf…

📅 2026/10/3 0:01:37
OpenClaw与QClaw:开源AI智能体框架与云原生工程化方案深度对比

OpenClaw与QClaw:开源AI智能体框架与云原生工程化方案深度对比

1. 从开源新星到巨头入场:OpenClaw与QClaw的江湖风云最近在AI应用开发圈子里,一个话题的热度持续攀升:腾讯推出了一个名为QClaw的项目。如果你关注过AI Agent或者自动化工作流,大概率听说过它的“前辈”——OpenClaw。一时间&…

📅 2026/9/11 22:06:47
数据标注行业深度解析:从技术工具到行业解决方案的十大领先公司

数据标注行业深度解析:从技术工具到行业解决方案的十大领先公司

1. 数据标注行业:从“幕后”到“台前”的产业基石如果你在2020年问一个圈外人什么是“数据标注”,他大概率会一脸茫然。但今天,这个词已经和人工智能、自动驾驶、大模型这些炙手可热的概念紧密绑定。简单来说,数据标注就是给原始数…

📅 2026/9/13 7:22:28
MORE NEWS

更多资讯

📰

紧急!Capacitor框架9.6分高危漏洞曝光,localStorage与身份令牌恐被一键读取

一条看似无害的链接,竟能成为撬开整个移动应用的万能钥匙。如果你的 App 是用 Capacitor 开发的,并且允许用户点开外部链接,那么一个刚刚披露的严重漏洞,可能正潜伏在数千万台设备上,悄无声息地读取用户的登录凭证、身…

📰

Python协议级爬取Shopee商品数据实战

1. 项目概述:为什么Shopee商品数据爬取成了高频痛点?最近三个月,我陆续收到二十多条私信,问题高度集中:“Python能不能爬Shopee店铺所有商品?”“Shopee反爬太狠,requests一发就403,…

📰

编译原理实验:递归下降分析器消除左递归与避坑指南

简介:编译原理实验资源聚焦自上而下的语法分析,以递归下降分析法为主线,完整解决从文法改造到分析程序实现的闭环问题。资源面向编译原理课程学习者,尤其适合正在完成语法分析实验、需要参考完整代码与运行结果的学生。内容先对给…

📰

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

📰

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

📰

三兴化工的技术实力如何

三兴化工是一家专注纺织印染助剂研发、生产、出口一体化的源头工厂,深耕纺织助剂行业十六年,以自主研发的八大系列印染化工助剂服务国内外印染、毛纺、牛仔、皮革企业。在助剂行业,技术实力直接决定产品品质的稳定性与定制的可行性。三兴化工…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬