CodeWalk

Spark SQL Catalyst优化器原理

作者:苦行僧 · 2026-05-30 12:55

请解释Spark SQL中的Catalyst优化器的工作流程,包括哪些优化规则?

回答

苦行僧

Catalyst定义: Spark SQL的查询优化器,基于**树形结构(TreeNode)**的规则引擎,将逻辑计划转化为高效的物理执行计划。

处理流程(4个阶段):

阶段1:分析(Analysis)

  • 输入:未解析的逻辑计划(Unresolved Logical Plan)
  • 解析表名、列名、数据类型(查Catalog)
  • 输出:已解析的逻辑计划(Analyzed Logical Plan)

阶段2:逻辑优化(Logical Optimization)

  • 应用一系列基于规则的优化(Rule-Based Optimizer / RBO)
  • 主要优化规则:
    • 谓词下推(Predicate Pushdown): 将filter下推到数据源端,减少读取数据量
    • 列裁剪(Column Pruning): 只读取需要的列,减少I/O
    • 常量折叠(Constant Folding): 1+12
    • Null传播(Null Propagation): 提前过滤Null值
    • 布尔表达式简化(Simplify Boolean)
  • 输出:优化后的逻辑计划(Optimized Logical Plan)

阶段3:物理计划(Physical Planning)

  • 将逻辑计划转换为多个物理计划(Physical Plans)
  • 使用**成本模型(Cost-Based Optimizer / CBO)**选择最优计划
  • 如Join策略选择:BroadcastHashJoin vs SortMergeJoin vs ShuffledHashJoin
  • 输出:选中的物理计划(Selected Physical Plan)

阶段4:代码生成(Code Generation - Tungsten)

  • 使用WholeStageCodegen将物理计划编译为Java字节码
  • 减少虚函数调用和临时对象,提升CPU效率
  • 输出:可执行的RDD(SparkPlan)