Apache Calcite介绍

Apache Calcite是一个提供SQL解析、查询优化和数据源连接的基础框架,支持OLAP和流处理。其核心是关系代数,通过优化器进行查询优化,旨在实现对多种数据源的一致性查询。Calcite的架构特点是灵活、可嵌入和可扩展,适用于多种计算平台和数据源。其处理流程包括SQL解析、语法验证、语义分析和逻辑计划优化。优化器包含规则、元数据提供者和规划引擎,用于生成高效的物理执行计划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apache Calcite 是一种提供了标准的 SQL 语言、多种查询优化和连接各种数据源基础框架,可以让用户轻松的接入各种数据,并实现使用SQL查询。此外,Calcite 还提供了 OLAP 和流处理的查询引擎。

Calcite是什么

Calcite 之前的名称叫做 optiq ,optiq 起初在 Hive 项目中,为 Hive 提供基于成本模型的优化,即 CBO(Cost Based Optimizatio)。2014 年 5 月 optiq 独立出来,成为 Apache 社区的孵化项目,2014 年 9 月正式更名为 Calcite。Calcite 项目的创建者是 Julian Hyde ,他在数据平台上有非常多的工作经历,曾经是 Oracle、 Broadbase 公司 SQL 引擎的主要开发者、SQLStream 公司的创始人和主架构师、Pentaho BI 套件中 OLAP 部分的架构师和主要开发者。现在他在 Hortonworks 公司负责 Calcite 项目,其工作经历对 Calcite 项目有很大的帮助。除了 Hortonworks,该项目的代码提交者还有 MapR 、Salesforce 等公司,并且还在不断壮大。

Calcite 的目标是one size fits all,希望能为不同计算平台和数据源提供统一的查询引擎,并以类似传统数据库的访问方式(SQL 和高级查询优化)来访问Hadoop 上的数据。Calcite 的架构有三个特点:flexible, embeddable, and extensible,就是灵活性、组件可插拔、可扩展,它的 SQL Parser 层、Optimizer 层等都可以单独使用,这也是 Calcite 受总多开源框架欢迎的原因之一。

关系代数

关系代数是关系型数据库操作的理论基础,关系代数支持并、差、笛卡尔积、投影和选择等基本运算。关系代数也是 Calcite 的核心,任何一个查询都可以表示成由关系运算符组成的树。在 Calcite 中,它会先将 SQL 转换成关系表达式(relational expression),然后通过规则匹配(rules match)进行相应的优化,优化会有一个成本(cost)模型为参考。

37e0bfc897bcf5dc9ba8f7f009670d89.png

查询优化

查询优化主要是围绕着 等价交换 的原则做相应的转换,这部分可以参考数据库系统概念(中文第六版)第13章——查询优化。这里举个简单的例子说明下

d8eb3ccc22447df6cf61f620752045cc.png

左图表示完整的一个原始的表达式树,如果将过滤条件(SELECT)下推,同时裁减相应的列(PROJECT)便可以的到右图所示的表达式树。在实际执行的时候,会极大的减少IO消耗以及中间结果产生的数据量。因此会有更高效的查询速度。

Calcite概念

70d33f7dcf4020d402ca5f78adab35fe.png

ef1c83e2b024959e62bf1b37ef884b6e.png

Calcite 架构

e64abbce6a19add8b8c490fcdf9cfc84.png

Calcite与传统数据库管理系统有一些相似之处,相比而言,它将数据存储、数据处理算法和元数据存储这些部分忽略掉了,这样设计带来的好处是:对于涉及多种数据源和多种计算引擎的应用而言,Calcite 因为可以兼容多种存储和计算引擎,使得 Calcite 可以提供统一查询服务,Calcite 将会是这些应用的最佳选择。

在 Calcite 架构中,最核心地方就是 Optimizer,也就是优化器,一个 Optimization Engine 包含三个组成部分:

  • rules:也就是匹配规则,Calcite 内置上百种 Rules 来优化 relational expression,当然也支持自定义 rules;

  • metadata providers:主要是向优化器提供信息,这些信息会有助于指导优化器向着目标(减少整体 cost)进行优化,信息可以包括行数、table 哪一列是唯一列等,也包括计算 RelNode 树中执行 subexpression cost 的函数;

  • planner engines:它的主要目标是进行触发 rules 来达到指定目标,比如RBO,CBO

Calcite 处理流程

a199f655f2176aabeda2e5d6d65a9c30.png

但这里为了讲述方便,把 SQL 的执行分为下面五个阶段(跟上面比比又独立出了一个阶段):

  • 解析 SQL, 把 SQL 转换成为 AST (抽象语法树),在 Calcite 中用 SqlNode 来表示;

  • 语法检查,根据数据库的元数据信息进行语法验证,验证之后还是用 SqlNode 表示 AST 语法树;

  • 语义分析,根据 SqlNode 及元信息构建 RelNode 树,也就是最初版本的逻辑计划(Logical Plan);

  • 逻辑计划优化,优化器的核心,根据前面生成的逻辑计划按照相应的规则(Rule)进行优化;

  • 物理执行,生成物理计划,物理执行计划执行。

这里只关注前四步的内容,会配合源码实现以及一个示例来讲解。

示例

181da32b7af54570fe3bc99f2170ca79.png

SQL 解析阶段(SQL–>SqlNode)

02a04008f5283928b1ca2dbbd76c02fe.png

Calcite 使用 JavaCC 做 SQL 解析,JavaCC 根据 Calcite 中定义的 Parser.jj 文件,生成一系列的 java 代码,生成的 Java 代码会把 SQL 转换成 AST 的数据结构(这里是 SqlNode 类型)。

b00d20845b0b885cfa6eec7cbf93fabd.png

SqlNode 验证(SqlNode–>SqlNode)

0e23cbbfe1f46f05754310839629b441.png

语义分析(SqlNode–>RelNode/RexNode)

经过第二步之后,这里的 SqlNode 就是经过语法校验的 SqlNode 树,接下来这一步就是将 SqlNode 转换成 RelNode/RexNode,也就是生成相应的逻辑计划(Logical Plan)。

87019b77be47d211c891f9d57c0552af.png

优化阶段(RelNode–>RelNode)

Calcite 中关于优化器提供了两种实现:

f6976ebc06b56f5a6980707f507e3507.png

HepPlanner

HepPlanner 会先将所有 relNode tree 转化为 HepRelVertex,这时就构建了一个 Graph:将所有的 elNode 节点使用 Vertex 表示,Gragh 会记录每个 HepRelVertex 的 input 信息,这样就是构成了一张 graph。在真正的实现时,递归逐渐将每个 relNode 转换为 HepRelVertex,并在 graph 中记录相关的信息。

96b4e135f5c7eb69b1221d3dc0b24565.png

VolcannoPlanner

07ac15176297d4e9cf2421ecf1bdd937.png

执行阶段

6174adeb31d0bcfe81f1c2230ce50e74.png

总结

252b8ad6357bbaf16aa20a74183799de.png


fac521109dfe875687fb6444e9967c88.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值