从Flink看看Calcite的使用方式

从Flink看看Calcite的使用方式,第1张

从Flink看看Calcite的使用方式

文章目录

前言分析

parseplanner

前言

已经有过一些博客介绍了Calcite的源码,但还没有介绍过如何使用Calcite的。Flink解析和优化用的都是Calcite,加上Flink的代码质量,应该是最适合参考的项目之一了。

分析

Flink一直致力于流批一体的处理,重构了不少代码,但是SQL的解析优化都在table模块

1.14.3的flink依赖的calcite版本是1.26.0

parse

Flink有很多自己的语法,所以在flink-sql-parse中自定义了很多语法。Flink沿用了freemarker模版,使用方式和Calcite极为相似。

FMPP模版相关

    Parser.tdd import很多Flink自己写的SqlNode和SqlTypeNameSpeccompoundIdentifier.ftl可以用来添加一些额外的语法实现(flink注释了整个文件并没使用)parserImpls.ftl定义了很多DDL语法(Calcite将其放在server模块而不是core而且实现比core少很多)config.fmpp将刚刚的文件组合起来交给freemarker

查询语句相关
DDL+ DQL + DML都有自己的实现在相应的包下面
类型相关
主要是实现了集合类型和Timestamp类型

Calcite这块实现不完善,Flink也将部分的代码贡献给了Calcite

异常校验相关

flink-sql-pars-hive的目录结构和上述的逻辑相似,就是对Hive独有语法和类型的适配

planner

这个模块代码就比上一个模块多很多了,不只包含逻辑计划、物理计划、很多对应的优化规则,还包含了对SqlNode的Validate。

parse
上面的parse模块只是定义了模版通过codegen生成parse的实现类,入口依旧是在planner这里

validate

convert
大部分RelNode和RexNode复用了Calcite的,所以SqlToRelConvert也复用了Calcite的。也就是说在FlinkPlannerImpl直接创建了Calcite的SqlToRelConverter

同时parse和validate的调用也封装在FlinkPlannerImpl中


Flink要对Catalog的schema和function进行适配,才能确保这些正确地被转为RelNode,有机会再展开介绍,

optimize

    Rule
    部分优化规则复用着Calcite的,也在rules.*的包下面定义了很多自己的,按照流处理和批处理的不同注册到了不同的RuleSets

    Program

如此多的优化规则,调度也是复杂的问题,Calcite通过Program接口去编排优化规则的调度顺序,Flink有很多实现

既有Hepplanner也有VolcanoPlanner,还针对VocalnoPlanner调整了cost的计算,有机会再展开介绍了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5720072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存