1、前言
1.1、JavaCC
JavaCC(Java Compiler Compiler)是一个开源的语法分析器生成器和词法分析器生成器。JavaCC通过词法和语法描述文件来生成分析器。
flink通过java CC生成分析器用于sql解析和校验。
如下图:在flink-table下的flink-sql-parser项目中,org.apache.flink.sql.parser.impl下的类,就是使用javacc生成的。

1.2、Calcite
Apache Calcite是一个动态数据管理框架 ,它具备很多典型数据库管理系统的功能,如SQL解析、SQL校验、SQL查询优化等,又省略了一些功能,如不存储相关数据,也不完全包含相关处理数据等。
flink中的sql解析、sql校验和sql优化便是依赖calcite来完成的。
梳理一下Calcite SQL执行的几个阶段:

- 通过Parser解析器将传入的sql解析成一颗词法树,SqlNode作为树的节点
- 做词法的校验Validate,类型校验,元数据校验等等
- 将校验好的SqlNode树转换成对应的关系代数表达式,也是一颗树,RelNode作为节点
- 将RelNode关系代数表达式树,通过内置的两种优化器Volcano , Hep 优化关系代数表达式得到最优逻辑代数的一颗树,也是RelNode
- 最优的逻辑代数表达式(RelNode),会被转换成对应的可执行的物理执

本文详细介绍了Flink SQL的处理流程,从JavaCC生成的SQL解析器解析SQL语句成SqlNode,再到Calcite进行校验和转换为Operation。接着,Flink利用Blink Planner将Operation转为RelNode并执行优化,最后生成Transformation并转化为可执行的流计算任务。整个流程涉及SqlNode、Operation、RelNode和Transformation的转化及优化。
最低0.47元/天 解锁文章
386





