Flink table/SQL架构演变

  • Flink1.9之前,批处理和流处理有以下几点不同
    • 各自独立的API(流处理DataStream,批处理DataSet)
    • 各自不同的执行计划解析过程
    • 各自不同的错的跟过程

因此,没有批流一体的概念,面向用户不友好。如下图所示:
flink SQL浅析

  • Flink1.9引入了blink planner将批SQL处理作为流SQL处理的特例。
    flink SQL浅析
  • Flink Planner用来兼容老版本
    • 批处理基于DataSet
    • 流处理基于DataStream
  • Flink用来处理新的代码和特性
    • 批处理和流出刘都解析为Stream Transformation统一实现,真正的实现批流一体

flink SQL的工作机制

Flink SQL 引擎的工作流总结如图所示。
flink SQL浅析
从上图可看出:SQL/TableAPI从输入到编译为可执行的JobGraph主要有以下几步:

  1. 将SQL文本/TableAPI代码转换为逻辑执行计划(Logical Plan)
  2. 逻辑执行计划通过优化器转化为物理执行计划(Physical Plan)
  3. 通过代码生成技术(CodeGen )生成transformation后进一步编译为可执行的JobGraph提交运行

SQL实现详述:

  • 将SQL文本/TableAPI代码转换为逻辑执行计划
    • SQL/TableAPI通过calcite框架将SQL解析转为AST抽象语法树
    • SQL Validator 获取Catalog中的元数据对表达式、表信息等进行校验,转化为关系代数表达式(RelNode)
    • 再由 Optimizer 将关系代数表达式转换为初始状态的逻辑执行计划

备注:TableAPI 代码使用 TableAPI Validator 对接 Catalog 后生成逻辑执行计划。

  • 逻辑执行计划通过优化器转化为物理执行计划
    • 常量折叠(Expression Reduce):预计算常量表达式,来得到一个常量。来避免执行时每条计算一遍
      flink SQL浅析

    • filter下推执行(PushDown Optimization):谓词下推使过滤条件尽可能的贴近元数据。
      flink SQL浅析

    • project下推执行(Projection Pushdown):列剪裁,优化掉没有使用的列
      flink SQL浅析

本文参考自以下文章:
FlinkSQL演进过程,解析原理及一些优化策略
Flink深入浅出:Flink SQL使用与原理
深入分析 Flink SQL 工作机制

相关文章: