Spark SQL 深度解析与性能调优——专栏导览
专栏简介
Apache Spark 从 2.x 开始,SQL 引擎(Spark SQL)已经超越 RDD API 成为绝大多数 Spark 作业的实际执行路径。无论是 DataFrame 操作、结构化流处理,还是直接执行 SQL 查询,最终都经过同一套查询引擎处理:Catalyst 优化器 + Physical Planner + 代码生成 / 向量化执行。
然而,大量 Spark 从业者只会写 SQL 和 DataFrame,面对慢查询时只会机械地增加资源或调整几个常见参数,却无法从执行计划层面找到真正的瓶颈。根本原因是:不理解 SQL 引擎内部在做什么。
本专栏从三个维度系统覆盖 Spark SQL 全栈:
- 引擎原理(01-05 篇):SQL 文本如何变成 RDD 执行?Catalyst 的 Rule 体系如何工作?物理计划如何选择 Join 策略?
- 运行时优化(06-08 篇):AQE 如何在运行时动态调整计划?Whole-Stage CodeGen 如何消灭虚调用开销?向量化引擎如何用列式处理压榨 SIMD 性能?
- 工程调优(09-12 篇):列式存储的 I/O 裁剪如何实现?数据倾斜如何系统性解决?如何读懂执行计划定位瓶颈?
专栏目录
| 序号 | 文章标题 | 核心主题 |
|---|---|---|
| 01 | Spark SQL 全局架构:从 SQL 文本到 RDD 执行的完整旅程 | SparkSession;Parser→Analyzer→Optimizer→Planner→RDD 五阶段;三种 API 统一路径 |
| 02 | Catalyst 解析与分析:从 AST 到 Logical Plan | Antlr4 Parser;Unresolved LogicalPlan;Analyzer 与 Catalog;Resolution 规则;类型推断 |
| 03 | Catalyst 逻辑优化:Rule-Based Optimizer 核心规则 | 谓词下推;列裁剪;常量折叠;子查询消除;自定义 Rule 扩展 |
| 04 | CBO 代价模型:统计信息驱动的执行计划选择 | ANALYZE TABLE;列直方图;Join Reordering;CBO 与 RBO 协作;CBO 失效场景 |
| 05 | Physical Planning:从逻辑计划到物理算子的策略选择 | SparkStrategy;五种 Join 策略选择条件与代价;Bucket Join 消除 Shuffle |
| 06 | AQE:运行时自适应查询优化 | QueryStage 物化边界;动态分区合并;动态 Join 策略切换;Skew Join 自动优化 |
| 07 | Whole-Stage CodeGen:JVM 字节码级别的性能飞跃 | Volcano 模型虚调用开销;CodeGen 原理;生成代码分析;触发条件与禁用场景 |
| 08 | 向量化执行引擎:列式处理与 SIMD 加速 | 向量化 vs CodeGen;Arrow 列式内存;Parquet 向量化读取;Photon 引擎;Native Execution 趋势 |
| 09 | 数据源与 I/O 优化:Parquet/ORC/Delta 的读写性能 | Row Group/Page 结构;谓词下推到文件层;列统计信息;分区裁剪;小文件合并 |
| 10 | 数据倾斜系统性解决方案 | 倾斜根因分类;Salting/Broadcast/AQE Skew Join/自定义 Partitioner;效果对比 |
| 11 | Spark SQL 调优实战:从执行计划读懂性能瓶颈 | EXPLAIN 解读;关键算子性能特征;Exchange 节点代价;调优推导链路 |
| 12 | Spark SQL 全参数速查手册 | 按场景分组的核心参数;参数联动关系;常见误配与生效条件 |
阅读路径建议
引擎原理路线(适合想理解”为什么”的读者):
01 → 02 → 03 → 04 → 05 → 06 → 07 → 08
性能调优路线(适合有具体问题要解决的读者):
01(了解全貌)→ 06(AQE)→ 09(I/O)→ 10(倾斜)→ 11(实战)→ 12(参数)
向量化专项路线:
07(CodeGen 基础)→ 08(向量化)
与已有专栏的关系
| 专栏 | 主要覆盖内容 | 本专栏的关联 |
|---|---|---|
| Spark RDD 核心原理解析 | RDD 五大属性、窄/宽依赖、迭代模型 | 本专栏的物理执行最终落地为 RDD,作为底层背景 |
| Spark Shuffle 与内存管理 | ExternalSorter、Spill、统一内存模型 | Join 策略章节涉及 Shuffle,原理见该专栏 |
| Spark 调度系统与执行模型 | DAGScheduler、TaskScheduler、Executor | SQL 最终提交到调度系统,调度细节见该专栏 |
| Spark 容错与状态管理 | Checkpoint、State Store、Watermark | Structured Streaming 有状态算子的基础,见该专栏 |
技术版本说明
本专栏以 Apache Spark 3.3 / 3.4 为基准版本。涉及 AQE(Spark 3.0+)、Whole-Stage CodeGen(Spark 2.0+)、向量化读取(Spark 3.0+ 增强)等特性时,会明确标注版本引入时间及演进历史。
关联专栏
- Spark RDD:物理执行最终落地为 RDD
- Spark Shuffle 与内存管理:Join 策略涉及 Shuffle
- Spark 调度系统:SQL 最终提交到调度系统执行
- Hive:Hive 与 Spark SQL 的 Catalyst 优化器设计高度相似
- Iceberg、Delta Lake:数据湖表格式与 Spark SQL 的深度集成