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

查询优化

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

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

Calcite概念

Calcite 架构

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 处理流程

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

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

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

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

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

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

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

示例

SQL 解析阶段(SQL–>SqlNode)

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

SqlNode 验证(SqlNode–>SqlNode)

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

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

优化阶段(RelNode–>RelNode)

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

HepPlanner

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

VolcannoPlanner

执行阶段

总结


Apache Calcite介绍相关推荐

  1. Apache Calcite 处理流程详解(一)

    关于 Apache Calcite 的简单介绍可以参考 Apache Calcite:Hadoop 中新型大数据查询引擎 这篇文章,Calcite 一开始设计的目标就是 one size fits a ...

  2. Apache calcite Quickstart

    [Calcite]Apache Calcite 框架初探及概念详解_董嘻嘻的博客-CSDN博客_apache calcite Apache Calcite介绍_pucheung的博客-CSDN博客 A ...

  3. Apache Calcite概念介绍

    一.介绍 1.简介 ● Apache Calcite是面向Hadoop新的查询引擎,它提供了标准的SQL语言.多种查询优化和连接各种数据源的能力. ● Calcite的目标是" one si ...

  4. 《Apache Flink官方文档》 Apache Flink介绍

    下面是关于Apache Flink(以下简称Filnk)框架和流式计算的概述.为了更专业.更技术化的介绍,在Flink文档中推荐了一些"概念性"的文章. 1.无穷数据集的持续计算 ...

  5. Apache Calcite初探和csv简单例子

    ApacheCalcite官网介绍 Apache Calcite is a dynamic data management framework. It contains many of the pie ...

  6. Apache Calcite 简介

    1. 什么是Apache Calcite ? Apache Calcite 是一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通 ...

  7. Apache Calcite教程-SQL解析-Calcite SQL解析

    Calcite SQL解析 一.代码结构 其中,在codegen文件夹下,  config.fmpp (主要制定实现类路径)表示calcite 模板配置,Parser.jj是JavaCC解析器所需解析 ...

  8. Apache Calcite 论文翻译

    Apache Calcite 论文原稿: https://arxiv.org/pdf/1802.10233.pdf 文章目录 Apache Calcite 论文 1.简介 1.1. 引言 2.相关工作 ...

  9. Apache Calcite官方文档中文版- 进阶-1. 适配器

    第二部分 进阶(Advanced) 1. 适配器(Adapters) 1.1 Schema adapters   一个schema adapter允许Calcite去读取特定类型的数据,将这些数据以一 ...

  10. Apache Spark 介绍的演讲ppt (slice),全英文

    这里是本人制作的Apache Spark 介绍的演讲ppt,全英文.这里粘贴部分截图,具体可到相应的链接下载ppt文件,ppt文件中有动画: 下载地址:https://download.csdn.ne ...

最新文章

  1. 结构对齐--__packed与#pragma pack
  2. 你会通过Docker部署war包吗
  3. actionscript 3.0 怎么写android 程序,(ActionScript3.0笔记)第一个程序HelloWorld!
  4. unittest-常见问题解决方案记录
  5. Vue过滤器_使用过滤器进行数据格式化操作---vue工作笔记0015
  6. 稳站大屏 AIoT 时代之巅,创维 Swaiot 生态品牌实现全面布局!
  7. Delphi7常用插件
  8. 工程师总结:PCB设计中降低噪声与电磁干扰的方法
  9. android中接口的作用是什么意思,Type-C接口有什么好处?和安卓micro USB接口有什么区别...
  10. 【142期】List 中 remove() 方法的“陷阱”,被坑惨了!
  11. 第十五章 Caché WebSocket
  12. 界面原型设计工具开源软件
  13. HBuilder调试夜神安卓模拟器方法
  14. LQR控制器——简单实现与仿真
  15. 股票实盘交易接口用什么编程的?
  16. 【项目】FT232RL设计记录
  17. 赵桐正 php,php面向对象-封装性
  18. 常用激活函数(relu,glu,gelu,swish等)
  19. 16m色真彩调色板设计制作
  20. S60 3rd手机权限突破

热门文章

  1. AWS的下一站:3.8万亿美元的企业IT市场
  2. 拯救者笔记本 除尘后 开机蓝屏
  3. 由浅入深:自己动手开发模板引擎——解释型模板引擎(一)
  4. apache hadoop 2.7.2 yarn node label测试结果
  5. 减轻压力保护脊椎,上学路上更轻松,Deuter多特护脊减负双肩背包体验
  6. 普通大一学生的自我反思
  7. 高速公路联网收费二义性路径识别系统原理及开发
  8. zipOutputStream压缩后用RAR解压出现“不可预料的压缩文件末端”错误
  9. qt使用鼠标事件获取鼠标在QLabel和Ui界面中的点击位置
  10. 溢出英语计算机,查看溢出(简述计算机溢出原理)