YON Blog

Calcite 集成姿势

Calcite 官方 tutorial 里给的集成方式是通过 JDBC 是来使用的 [1],这种方式的优点是简单,但是缺点也很明显,就是灵活度差。最近的项目一开始就直接使用了 JDBC 来集成,随着项目的推进,有些时候想要对框架进行一些自定义的配置,发现根本没有办法。没有办法,今天借鉴了 Flink 和 Calcite JDBC 方式的源码对项目进行重构,使用 Calcite 提供的基础组件来进行 SQL 的解析、优化和执行。

Flink 入口是 Planner 接口 [2],它有两个子类 BatchPlanner 和 StreamPlanner,但这两个类共用了很多相同的逻辑,都继承了 PlannerBase。通过 Planner 我们能够拿到 Parser 对 SQL 进行解析和 RelNode 的转换,Planner 还有个 translate 方法来对 RelNode 进行优化并转换成物理执行计划。PlannerBase 里有个 PlannerContext 对象,里面封装了很多 Calcite 相关的配置。PlannerContext 里又有个 FlinkPlannerImpl 对象,这个对象负责实际和 Calcite 进行交互对 SQL 进行解析和转换成 RelNode。总结,粗看下来,整个结构挺乱的。

Calcite 就直接撸 CalcitePrepareImpl 的代码吧。

[1] Background

[2] Flink SQL w/ Blink Planner执行流程解析(上篇)