摘要:从 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

五、总结

  1. 演变主线:Shark→SchemaRDD→DataFrame+Catalyst(1.3)→Dataset+Encoder(1.6)→WholeStageCodegen(2.0)→AQE+DPP(3.0)。

  2. Catalyst 四阶段:Analysis→Logical Optimization(70+规则)→Physical Planning(CBO+AQE)→Code Generation。

  3. 关键转折:DataFrame(1.3)让 Spark 有了查询优化器;Dataset(1.6)让 API 层面类型安全;AQE(3.0)让优化从编译时跃升到运行时。


作者:starzy
博客blog.starzy.cn
GitHubstarzy1990.github.io
专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐