Calcite第一课

news2024/11/17 7:47:03

Calcite 是什么?

2024 年 9 月,最新版本 1.37.0 。前面三节我们先不看任何的源码,只从背景、介绍、概念、原理层面入手,作为深入学习和源码分析的预备。

如果用一句话形容 Calcite,Calcite 是一个用于优化异构数据源的查询处理的基础框架

最近十几年来,出现了很多专门的数据处理引擎。例如列式存储 (HBase)、流处理引擎 (Flink)、文档搜索引擎 (Elasticsearch) 等等。这些引擎在各自针对的领域都有独特的优势,在现有复杂的业务场景下,我们很难只采用当中的某一个而舍弃其他的数据引擎。当引擎发展到一定成熟阶段,为了减少用户的学习成本,大多引擎都会考虑引入 SQL 支持,但如何避免重复造轮子又成了一个大问题。

基于这个背景,Calcite 横空出世,它提供了标准的 SQL 语言、多种查询优化和连接各种数据源的能力,将数据存储以及数据管理的能力留给引擎自身实现。同时 Calcite 有着良好的可插拔的架构设计,我们可以只使用其中一部分功能构建自己的 SQL 引擎,而无需将整个引擎依托在 Calcite 上。因此 Calcite 成为了现在许多大数据框架 SQL 引擎的最佳方案。

八面玲珑的方解石

Calcite(中文意为方解石) 一开始设计的目标就是 one size fits all,它希望能为不同计算存储引擎提供统一的 SQL 查询引擎,当然 Calcite 并不仅仅是一个简单的 SQL 查询引擎,Calcite 的架构有三个特点:flexible, embeddable, and extensible,就是灵活性、组件可插拔、可扩展,它的 SQL Parser 层、Optimizer 层等都可以单独使用,这也是 Calcite 受总多开源框架欢迎的原因之一。

背景介绍(官网)

文档地址: Background - apache.org

Apache Calcite 是一个动态数据管理框架。

它包含构成典型数据库管理系统的许多部分,但省略了一些关键功能:数据存储、数据处理算法和元数据存储库。

Calcite 设计为不参与数据的存储和处理。正如我们将要看到的,这使它成为应用程序与一个或多个数据存储位置和数据处理引擎之间的绝佳中介。它还是构建数据库的完美基础:只需添加数据即可。

关系代数的基本知识

关系代数是关系型数据库操作的理论基础,关系代数支持并、差、笛卡尔积、投影和选择等基本运算。关系代数也是 Calcite 的核心,任何一个查询都可以表示成由关系运算符组成的树。

在 Calcite 中,它会先将 SQL 转换成关系表达式(relational expression),然后通过规则匹配(rules match)进行相应的优化,优化时会有一个成本(cost)模型为参考。

先看下关系代数相关内容,这对于理解 Calcite 很有帮助,特别是 Calcite Optimizer 这块的内容:

名称英文符号说明
选择selectσ类似于 SQL 中的 where
投影projectΠ类似于 SQL 中的 select
union类似于 SQL 中的 union
集合差set-difference-SQL中没有对应的操作符
笛卡儿积Cartesian-product×类似于 SQL 中不带 on 条件的 inner join
重命名renameρ类似于 SQL 中的 as
集合交intersectionSQL中没有对应的操作符
自然连接natural join类似于 SQL 中的 inner join
赋值assignment

核心架构

在这里插入图片描述

中间的方框总结了 Calcite 的核心结构:

  • 首先 Calcite 通过 SQL Parser 和 Validator 将一个 SQL 查询解析得到一个抽象语法树 (AST, Abstract Syntax Tree)-
  • 由于 Calcite 不包含存储层,因此它提供了另一种定义 table schema 和 view 的机制—— Catalog 作为元数据的存储空间(另外 Calcite 提供了 Adaptor 机制连接外部的存储引擎获取元数据,这部分内容不在本文范围内)。
  • 之后,Calcite 通过优化器生成对应的关系表达式树,根据特定的规则进行优化。
  • 优化器是 Calcite 最为重要的一部分逻辑,它包含了三个组件:Rule、MetadataProvider(Catalog)、Planner engine。

通过架构图我们可以看出,Calcite 最大的特点(优势)是它将 SQL 的处理、校验和优化等逻辑单独剥离出来,省略了一些关键组件,例如,数据存储,处理数据的算法以及用于存储元数据的存储库。

其次 Calcite 做得最出色的地方则是它的可插拔机制,每个大数据框架都可以选择 Calcite 的整体或部分模块建立自己的 SQL 处理引擎,如 Hive 自己实现了 SQL 解析,只使用了 Calcite 的优化功能,Storm 以及 Flink 则是完全基于 Calcite 建立了 SQL 引擎。

四个阶段

在这里插入图片描述

Calcite 框架的运行主要分四个阶段:

  1. Parse:使用 JavaCC 生成的解析器进行词法、语法分析,得到 AST;
  2. Validate:结合元数据进行校验;
  3. Optimize:将 AST 转化为逻辑执行计划(tree of relational expression),并根据特定的规则(heuristic 或 cost-baesd)进行优化;
  4. Execute:将逻辑执行计划转化成引擎特有的执行逻辑,比如 Flink 的 DataStream。第 4 步是一个和引擎耦合的流程。

在这里插入图片描述

启发式算法(heuristic algorithm)就是例如遗传算法,模拟退火,各种群算法,蚁群,鱼群,粒子群,人工神经网络等模仿自然界或生命体行为模式的算法,一般又称人工智能算法或全局优化算法。
启发式算法是指具有自学习功能,可利用部分信息对计算产生推理的算法。

四大组件

围绕着这个运行流程,Apache Calcite 最核心的框架可以拆分为四个组件

  1. SQL Parser:将符合语法规则的 SQL 转化成 AST(Sql text → SqlNode),Calcite 提供了默认的 parser,但也可以基于 JavaCC 生成自定义的 parser;通过 Parser, 可以将 Sql 转化成 SqlNode, 什么是 SqlNode? SqlNode 是 Calcite 中用于表达关系运算的中间数据结构,也就是标识符、字符串常量、函数调用、动态参数等等,这样 SQL 就从普通文本变成了有类型的结构。

    在Calcite中,所有的操作都是一个SqlCall, 如查询是一个SqlSelect, 删除是一个SqlDelete等,对应的查询条件等为SqlCall中的参数。

  2. Catalog:定义记录了 SQL 的 metadata 和 namespace,方便后续的访问和校验;

  3. SQL Validator:结合 Catalog 提供的元数据校验 AST,具体的实现都在 SqlValidatorImpl 中;此过程主要是根据定义的scheam, table, columns 来验证SqlNode是否合法。

  4. Query Optimizer:这块概念较多,首先需要将 AST 转化成逻辑执行计划(即 SqlNode → RelNode),其次使用 Rules 优化逻辑执行计划。查询优化主要是围绕着 等价交换 的原则做相应的转换。

参考文档

Calcite:Apache Calcite 框架初探及概念详解

Apache Calcite 处理流程详解-Matt’s Blog

Apache Calcite:Hadoop中新型大数据查询引擎_开源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最全测评!分享7款超好用的AI论文润色网站

在当前的学术写作领域,AI论文润色工具已经成为提升论文质量和效率的重要助手。以下是七款超好用的AI论文润色网站,其中特别推荐千笔-AIPassPaper。 一、千笔-AIPassPaper 是一款集论文大纲生成、内容填充、文献引用、查重修改于一体的全方位论文写作平…

友思特“未来视界”趣味实验室 | 第2讲:中草药的高光谱成像

第2讲 ——当中药遇上高光谱系统 友思特“未来视界”实验室第二讲开课了!本期主角是凝结了中国古老智慧的特色——中药。 从神农尝百草到《本草纲目》典籍问世,中药材发展至今,品类已高达上万种。在这其中,难免会存在形态相似而…

曲面构件的布尔运算

1.前言 布尔运算算法有多种,可以根据几何数据表达方式分为Brep布尔运算、CSG布尔运算、网格布尔运算等,而网格布尔运算又又多种,如BSP方式、八叉树方式,博主实现过Brep布尔运算、BSP和八叉树两种网格布尔运算。详细可参考博主文章…

[NewStarCTF 2023 公开赛道]Begin of PHP1

开始代码审计. <?php error_reporting(0); highlight_file(__FILE__);if(isset($_GET[key1]) && isset($_GET[key2])){echo "Level 1<br>";if($_GET[key1] ! $_GET[key2] && md5($_GET[key1]) md5($_GET[key2])){$flag1 True;}else{die(…

依赖倒转原则(DIP)

依赖倒转原则&#xff08;DIP&#xff09;&#xff1a;Dependency Inversion Principle&#xff0c;模块之间要依赖抽象&#xff0c;不依赖实现&#xff0c;要面向接口编程&#xff0c;不要面向实现编程。高层次模块不应该直接依赖低层模块&#xff0c;这样就降低了客户端与实现…

2024.9.26 作业 +思维导图

一、作业 1、什么是虚函数&#xff1f;什么是纯虚函数 虚函数&#xff1a;函数前加关键字virtual&#xff0c;就定义为虚函数&#xff0c;虚函数能够被子类中相同函数名的函数重写 纯虚函数&#xff1a;把虚函数的函数体去掉然后加0&#xff1b;就能定义出一个纯虚函数。 2、基…

排序--堆排序【图文详解】

二叉树的相关概念 叶子&#xff1a;没有子节点的节点叫叶子节点 大根堆&#xff1a;所有的父亲大于儿子 小根堆&#xff1a;所有的儿子大于父亲 父亲于儿子的的下标关系&#xff1a; 父亲的下标为i &#xff0c;那么左孩子的下标为2*i1&#xff0c;右孩子的下标为2i2 子的下…

Fuxi:一款功能强大的跨平台渗透测试工具

关于Fuxi Fuxi是一款功能强大的跨平台渗透测试工具&#xff0c;该工具基于Python 3开发&#xff0c;支持在Linux、macOS和Windows操作系统上使用&#xff0c;具备良好的跨平台特性。在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地执行渗透测试和安全研究任务。 工具…

SpringCloudEureka简介

背景 SpringCloudEureka是基于NetfliEureka做了二次封装&#xff0c;负责微服务架构的服务治理功能。 SpringCloud通过为Eureka增加SpringBoot风格的自动化配置&#xff0c;只需要简单的引入依赖和注解配置&#xff0c;就能让SpringBoot构建的微服务应用轻松和Eureka服务治理体…

SQL语言入门

一、SQL语言入门&#xff1a; 数据库管理人员&#xff08;DBA&#xff09;通过数据库管理系统&#xff08;DBMS&#xff09;可以对数据库&#xff08;DB&#xff09;中的数据进行操作 SQL是一种非过程化语言&#xff0c;只需提出“做什么”&#xff0c;而不需要指明“怎么做”…

11. LCEL:LangChain Expression Language

这篇文章覆盖了LCEL的理解和他是如何工作的。 LCEL(LangChain Expression Language)&#xff1a;是把一些有趣python概念抽象成一种格式&#xff0c;从而为构建LangChain组件链提供一种“简约”代码层。 LCEL在下面方面有着强大的支撑&#xff1a; 链的快速开发流式输出、异…

C++ 刷题 使用到的一些有用的容器和函数

优先队列 c优先队列priority_queue&#xff08;自定义比较函数&#xff09;_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a; class Solution { public:vector<vector<int>> kSmallestP…

java 解析excel (本地资源)

在Java中解析Excel文件&#xff0c;可以使用Apache POI库。以下是一个简单的例子&#xff0c;展示如何使用Apache POI读取一个Excel文件&#xff08;假设为.xlsx格式&#xff09;的内容。 首先&#xff0c;确保你的项目中包含了Apache POI的依赖。如果你使用Maven&#xff0c;…

绝了,自从用了它,我每天能多摸鱼2小时!

大家好&#xff0c;我是可乐。 俗话说的好&#xff1a;“摸鱼一时爽&#xff0c;一直摸鱼一直爽”。 作为一个程序员&#xff0c;是否有过调试代码熬到深夜&#xff1f;是否有过找不到解决方案而挠秃头顶&#xff1f; 但现在你即将要解放了&#xff0c;用了这款工具——秘塔…

【PWN · HOO | HOF | Tcache pthread struct】[2024 · ByteCTF] ezheap

在学习了一段时间堆后&#xff0c;终于能较为从容、有思路地做题了 目录 前言 一、题目 二、总体思路 三、攻击过程调试 &#xff08;1&#xff09;House of Orange &#xff08;2&#xff09;House of Force tcache pthread struct attack 四、EXP 总结 前言 做完…

Maya没有Arnold材质球

MAYA 没有Arnold材质球_哔哩哔哩_bilibili

OJ在线评测系统 前端 完善题目提交服务 细讲异步前端请求与后端接口交互

题目提交服务完善 这则笔记是我们来梳理一下前后端逻辑 主要是我们的提交逻辑 先是看前端 按钮绑定的是这个异步请求 async 关键字表示这个函数内部会使用 await 来等待异步操作完成。 异步提交表单数据 const doSubmit async () > {// message.error("刷题机架构…

第二十九篇——用间篇:间谍的五种用法

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 间谍的用法&#xff0c;精准的说明了对应的边界&#xff1b;以及在什么场…

字节打印流字符打印流

打印流不能读&#xff0c;只能写 打印流 分类:打印流一般是指:PrintStream&#xff0c;PrintWriter两个类 特点1:打印流只操作文件目的地&#xff0c;不操作数据源 特点2:特有的写出方法可以实现&#xff0c;数据原样写出 特点3:特有的写出方法&#xff0c;可以实现自动刷新…

如何将二氧化碳“封”入海底?

什么&#xff1f;人类在收集空气&#xff1f;&#xff01;&#xff01; 收集的二氧化碳用来干什么&#xff1f;这活咋干&#xff1f; 近期了解到一则新闻&#xff1a; 不得不说人类的智慧真是令人感叹&#xff0c;我们确实在为地球的环保事业添砖加瓦&#xff0c;点点滴滴的努…