SparkSQL 演变历史分析
摘要:从 2012 年的 Shark 到 2020 年的 Adaptive Query Execution,SparkSQL 走过了一条从"Hive on Spark"到"世界级 SQL 引擎"的进化之路。本文沿时间线追溯 Shark→SchemaRDD→DataFrame→Dataset→AQE 五个关键阶段,深度解析 Catalyst 优化器的 TreeNode+Rule 架构(Analysis→Logical Optimization→Physical Planning→Code Generation),配合版本能力矩阵和 2 张原创架构图,完整展现 SparkSQL 的十年演变史。
关键词:SparkSQL, DataFrame, Dataset, Catalyst, Tungsten, AQE, WholeStageCodegen, Shark
一、开篇:为什么需要理解 SparkSQL 的演变?
SparkSQL 是 Spark 生态中使用最广泛的模块——从 spark.sql("SELECT ...") 到 df.filter().groupBy().agg(),背后是近十年持续演进的查询引擎。
SparkSQL 演变主线
2012: Shark (Hive on Spark) → 2014 废弃
2014: SchemaRDD (Spark 1.0-1.2) → DataFrame 前身
2015: DataFrame + Catalyst (1.3) → 🔥 里程碑
2016: Dataset + Tungsten (1.6-2.0) → 类型安全+极致性能
2017: WholeStageCodegen (2.0) → 全阶段代码生成
2020: AQE + DPP (3.0) → 运行时自适应优化
二、演变全景时间线

阶段一:Shark (0.9~1.0) — 已废弃
Shark = HiveQL 解析 → 翻译为 RDD 操作 → 在 Spark 上执行
优势: 复用 Hive 元数据 · SerDe · UDF · 比 Hive MR 快 100x
致命缺陷:
❌ 编译缓慢(HiveQL→RDD 翻译层开销大)
❌ 不支持中间结果缓存
❌ 与 Spark 编程模型割裂
❌ 无 Catalyst · 无 Tungsten
阶段二:SchemaRDD (1.0~1.2)
SchemaRDD = RDD[Row] + Schema 信息
spark.sql("SELECT * FROM t") → SchemaRDD
局限: 无类型安全 · 无 Encoder · 无 Catalyst
阶段三:DataFrame + Catalyst (1.3) — 里程碑
DataFrame = Dataset[Row] — 带 Schema 的分布式数据表
Catalyst Optimizer 首次引入
核心优化: 谓词下推 · 列裁剪 · 常量折叠 · 投影合并
Tungsten 引擎: 堆外内存 · 代码生成 · 缓存友好布局
阶段四:Dataset + Encoder (1.6~2.x)
Dataset[T] = DataFrame + Encoder[T]
Encoder: JVM 对象 ↔ Spark SQL 内部二进制格式(比 Kryo 快 ~10x)
编译时类型安全 + 运行时 Tungsten 优化
Spark 2.0: WholeStageCodegen
阶段五:AQE + DPP (3.0+)
AQE 三大利器:
① 动态合并 Shuffle 分区
② 动态切换 Join 策略(SortMerge → Broadcast)
③ 动态优化数据倾斜 Join
DPP: 分区裁剪下推到 Scan
ANSI SQL 模式
三、Catalyst 优化器核心架构

3.1 四阶段流水线
① Analysis: Unresolved → Resolved LogicalPlan
解析表名/列名/函数名 → 类型推断与隐式转换
② Logical Optimization (70+ 规则):
谓词下推·列裁剪·常量折叠·子查询消除·布尔简化
③ Physical Planning:
Cost-Based: 评估行数/数据大小 → 选择最佳 Join 策略
AQE (3.0+): 运行时根据实际数据量动态调整
④ Code Generation:
WholeStageCodegen → 多算子融合 → Janino 编译
3.2 RuleExecutor 引擎
Batch("OperatorOptimization", FixedPoint(100),
PushPredicateThroughJoin, // 谓词穿透 Join
ColumnPruning, // 列裁剪
NullPropagation, // Null 传播
ConstantFolding, // 常量折叠
BooleanSimplification, // 布尔简化
...70+ 规则
)
// 策略: Once · FixedPoint(N) · Strategy
四、版本能力矩阵
| 能力 | 1.0 Shark | 1.3 DataFrame | 2.0 Dataset | 3.0 AQE |
|---|---|---|---|---|
| Catalyst | ✗ | ✓ | ✓+Cost | ✓++ |
| Tungsten | ✗ | ✓ | ✓+WSCG | ✓++ |
| AQE | ✗ | ✗ | ✗ | ✓ |
| Encoder | ✗ | ✗ | ✓ | ✓ |
| ANSI SQL | ✗ | ✗ | ✗ | ✓ |
五、总结
-
演变主线:Shark→SchemaRDD→DataFrame+Catalyst(1.3)→Dataset+Encoder(1.6)→WholeStageCodegen(2.0)→AQE+DPP(3.0)。
-
Catalyst 四阶段:Analysis→Logical Optimization(70+规则)→Physical Planning(CBO+AQE)→Code Generation。
-
关键转折:DataFrame(1.3)让 Spark 有了查询优化器;Dataset(1.6)让 API 层面类型安全;AQE(3.0)让优化从编译时跃升到运行时。
作者:starzy
博客:blog.starzy.cn
GitHub:starzy1990.github.io
专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践
更多推荐



所有评论(0)