一、概述

从 Flink 1.9 开始,Flink 提供了两种不同的 Planner 实现来执行 Table & SQL API 程序:

  • Blink Planner:Flink 1.9+
  • Old Planner:Flink 1.9 之前

在 1.14 新版本中,Old Planner 被移除,Blink Planner 将成为 Planner 的唯一实现

https://mp.weixin.qq.com/s/KaRjvtfLHJRqfmf1790chQ

二、Planner

二、流程

一段查询 SQL / 使用TableAPI 编写的程序从输入到编译为可执行的 JobGraph 主要经历如下几个阶段

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

SQL语句经过Calcite解析生成抽象语法树SQLNode,基于生成的SQLNode并结合flink Catalog完成校验生成一颗Operation树,接下来blink planner将Operation树,接下来blink planner将Opearation树转为RelNode然后进行优化,最后生成Transformation变成流计算任务。

https://blog.csdn.net/Yuan_CSDF/article/details/123397988

https://developer.aliyun.com/article/765311#slide-7

2.1. 逻辑计划

Flink SQL 引擎使用 Apache Calcite SQL Parser 将 SQL 文本解析为词法树,SQLValidator 获取 Catalog 中元数据的信息进行语法分析和验证,转化为关系代数表达式(RelNode),再由 Optimizer 将关系代数表达式转换为初始状态的逻辑执行计划。

和 SparkSQL 类似

Flink 中的 sql 解析、sql 校验和 sql 优化便是依赖 Calcite 来完成的。

Apache Calcite 是一个动态数据管理框架 ,它具备很多典型数据库管理系统的功能,如SQL解析、SQL校验、SQL查询优化等,又省略了一些功能,如不存储相关数据,也不完全包含相关处理数据等。

2.1.1. SQL 文本解析为词法树

调用 parser 方法,将 SQL 转为未经校验的 AST 抽象语法树,也就是 SqlNode,它主要会用到词法解析和语法解析。词法解析就是将Sql语句转为一组token,而语法解析就是将 token 进行递归下降词法分析。

Flink 中 Calcite 通过 JavaCC 生成分析器用于 sql 解析和校验。

Spark 使用 Antlr

2.1.2. RelNode

SQL Validator 获取 Catalog 中元数据的信息进行语法分析和验证,转化为关系代数表达式(RelNode)

将未经校验的抽象语法树校验成已经校验的抽象语法树,在校验阶段主要校验两部分:

  1. 校验表名,字段名,函数名是否正确
  2. 校验特殊的类型是否正确,如 join 操作,groupby 是否有嵌套等

调用rel()方法:将抽象语法树SqlNode转为关系代数树RelNode(关系代数表达式)和RexNode行表达式,在这个过程中,DDL它是不执行rel()方法的,因为DDL实际是对元素区的修改,不涉及复杂查询

调用 $convert()$ 方法将 RelNode 转化为 operation,operation 它包括多种类型,但最终都会生成根节点 modify operation

2.1.3. Optimizer

2.2. 物理计划

2.3. Translation & Code Generation

代码生成(Code Generation)在计算机领域是一种广泛使用的技术。在 Physical Plan 到生成 Transformation Tree 过程中就使用了 Code Generation。

Flink SQL 引擎会将 Physical Plan 通过 Code Generation 翻译为 Transformations,再进一步编译为可执行的 JobGraph。

https://blog.csdn.net/weixin_44052055/article/details/126035846

https://mp.weixin.qq.com/s/9OvQ8EoFVDJGbMyHbpkMyg