Apache Calcite介绍

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)模型为参考。

Apache Calcite介绍_第1张图片

查询优化

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

Apache Calcite介绍_第2张图片

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

Calcite概念

Apache Calcite介绍_第3张图片

Apache Calcite介绍_第4张图片

Calcite 架构

Apache Calcite介绍_第5张图片

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)进行优化;

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

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

示例

Apache Calcite介绍_第6张图片

SQL 解析阶段(SQL–>SqlNode)

Apache Calcite介绍_第7张图片

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

Apache Calcite介绍_第8张图片

SqlNode 验证(SqlNode–>SqlNode)

Apache Calcite介绍_第9张图片

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

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

Apache Calcite介绍_第10张图片

优化阶段(RelNode–>RelNode)

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

Apache Calcite介绍_第11张图片

HepPlanner

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

Apache Calcite介绍_第12张图片

VolcannoPlanner

Apache Calcite介绍_第13张图片

执行阶段

Apache Calcite介绍_第14张图片

总结

Apache Calcite介绍_第15张图片


Apache Calcite介绍_第16张图片

你可能感兴趣的:(数据库,大数据,编程语言,python,java)