Spark SQL Catalyst优化器原理
请解释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+1→2 - 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)