SparkSQL 演变历史分析

发布时间:2026/8/19 22:31:30
SparkSQL 演变历史分析 摘要从 2012 年的 Shark 到 2020 年的 Adaptive Query ExecutionSparkSQL 走过了一条从Hive on Spark到世界级 SQL 引擎的进化之路。本文沿时间线追溯 Shark→SchemaRDD→DataFrame→Dataset→AQE 五个关键阶段深度解析 Catalyst 优化器的 TreeNodeRule 架构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,// 谓词穿透 JoinColumnPruning,// 列裁剪NullPropagation,// Null 传播ConstantFolding,// 常量折叠BooleanSimplification,// 布尔简化...70规则)// 策略: Once · FixedPoint(N) · Strategy四、版本能力矩阵能力1.0 Shark1.3 DataFrame2.0 Dataset3.0 AQECatalyst✗✓✓Cost✓Tungsten✗✓✓WSCG✓AQE✗✗✗✓Encoder✗✗✓✓ANSI SQL✗✗✗✓五、总结演变主线Shark→SchemaRDD→DataFrameCatalyst(1.3)→DatasetEncoder(1.6)→WholeStageCodegen(2.0)→AQEDPP(3.0)。Catalyst 四阶段Analysis→Logical Optimization(70规则)→Physical Planning(CBOAQE)→Code Generation。关键转折DataFrame(1.3)让 Spark 有了查询优化器Dataset(1.6)让 API 层面类型安全AQE(3.0)让优化从编译时跃升到运行时。作者starzy博客blog.starzy.cnGitHubstarzy1990.github.io专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践