flink SQL解析
Flink table/SQL架构演变
- Flink1.9之前,批处理和流处理有以下几点不同
- 各自独立的API(流处理DataStream,批处理DataSet)
- 各自不同的执行计划解析过程
- 各自不同的错的跟过程
因此,没有批流一体的概念,面向用户不友好。如下图所示:
- Flink1.9引入了blink planner将批SQL处理作为流SQL处理的特例。
- Flink Planner用来兼容老版本
- 批处理基于DataSet
- 流处理基于DataStream
- Flink用来处理新的代码和特性
- 批处理和流出刘都解析为Stream Transformation统一实现,真正的实现批流一体
flink SQL的工作机制
Flink SQL 引擎的工作流总结如图所示。
从上图可看出:SQL/TableAPI从输入到编译为可执行的JobGraph主要有以下几步:
- 将SQL文本/TableAPI代码转换为逻辑执行计划(Logical Plan)
- 逻辑执行计划通过优化器转化为物理执行计划(Physical Plan)
- 通过代码生成技术(CodeGen )生成transformation后进一步编译为可执行的JobGraph提交运行
SQL实现详述:
- 将SQL文本/TableAPI代码转换为逻辑执行计划
- SQL/TableAPI通过
calcite框架将SQL解析转为AST抽象语法树 - SQL Validator 获取Catalog中的元数据对表达式、表信息等进行校验,转化为关系代数表达式(RelNode)
- 再由 Optimizer 将关系代数表达式转换为初始状态的逻辑执行计划
- SQL/TableAPI通过
备注:TableAPI 代码使用 TableAPI Validator 对接 Catalog 后生成逻辑执行计划。
- 逻辑执行计划通过优化器转化为物理执行计划
-
常量折叠(Expression Reduce):预计算常量表达式,来得到一个常量。来避免执行时每条计算一遍
-
filter下推执行(PushDown Optimization):谓词下推使过滤条件尽可能的贴近元数据。
-
project下推执行(Projection Pushdown):列剪裁,优化掉没有使用的列
-
本文参考自以下文章:
FlinkSQL演进过程,解析原理及一些优化策略
Flink深入浅出:Flink SQL使用与原理
深入分析 Flink SQL 工作机制