Calcite数据管理实战

978-7-115-57773-3
作者: 刘钧文悟初境孙潇俊
译者:
编辑: 郭媛

图书目录:

详情

Calcite 是一款开源的动态数据管理框架,其目标是一种方案适应所有需求场景,能为不同计算平台和数据源提供统一的查询引擎,它对于没有高并发、低延时的多数据源间的数据管理有着天然的优势,是解决多数据源统一管理问题的利器。 本书围绕Calcite,结合其数据库基础知识、核心理论以及相关的项目实践情况,从SQL 的解析、校验、优化、执行等流程,对Calcite 组件进行介绍。同时本书为部分章节配置对应的代码和实例,帮助读者加深理解。 本书内容由理论到实践,将源码解析与实际案例相结合,可以作为Calcite 新手的入门图书以及快速上手的参考书,也可以作为大数据开发人员和从业人员的学习用书,还可以作为相关培训机构以及高等院校的教学用书。

图书摘要

版权信息

书名:Calcite数据管理实战

ISBN:978-7-115-57773-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


著    刘钧文 悟初境 孙潇俊

责任编辑 郭 媛

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Calcite 是一款开源的动态数据管理框架,其目标是一种方案适应所有需求场景,能为不同计算平台和数据源提供统一的查询引擎,它对于没有高并发、低延时的多数据源间的数据管理有着天然的优势,是解决多数据源统一管理问题的利器。

本书围绕Calcite,结合其数据库基础知识、核心理论以及相关的项目实践情况,从SQL的解析、校验、优化、执行等流程,对Calcite组件进行介绍。同时本书为部分章节配置对应的代码和实例,帮助读者加深理解。

本书内容由理论到实践,将源码解析与实际案例相结合,可以作为Calcite新手的入门图书以及快速上手的参考书,也可以作为大数据开发人员和从业人员的学习用书,还可以作为相关培训机构以及高等院校的教学用书。


SQL查询优化是数据库这一软件行业“皇冠上明珠”最精彩的部分,也是最具挑战性的部分,故而一直是学术界和工业界研究的重点领域之一。随着开源的流行,业内出现了多款开源查询优化器,其中PostgreSQL的查询优化技术一直是开源数据库中的佼佼者。近年来又出现了多个独立的开源查询优化器项目,譬如Greenplum Orca、Apache Calcite等。Apache Calcite因Apache开源基金会的完善生态而快速流行起来,成为很多新兴数据库的优化器之选。这本书系统介绍了查询优化器和Calcite的内部实现机制,将查询优化理论和代码实践结合起来,深入浅出,非常值得阅读。

——姚延栋,四维纵横创始人,Greenplum中文社区创始人,PostgreSQL中文社区常委

层出不穷的创新场景,使数据库从单一品类一统天下朝着碎片化的趋势急速转向。面向异构数据源的联合查询,已经受到越来越多的开发者关注。

Apache Calcite 将查询优化器这一数据库领域的技术壁垒,抽象成可供开发者使用的基础组件,极大地降低了自研查询引擎的难度。除此之外,它还提供了可灵活扩展的 SQL 解析器和存储适配器,提供更加便捷的一站式使用模式。

对于数据领域的开发者来说,Apache Calcite 是必不可少的利器。越来越多的开源和商业项目使用它构建自己的查询体系,其中也包括我所创业的项目Apache ShardingSphere。

非常开心能在这个时间节点看到这本著作,它不但能够为 Apache Calcite的初学者提供体系化的学习资料,也能够作为克服Calcite陡峭的学习曲线的指路明灯。

——张亮,Apache ShardingSphere 项目主席,SphereEx 公司创始人

通读本书,满目珠玑,常有醍醐灌顶之感。这本书从大处着眼,小处着手,通过源码与实战案例的结合,介绍了Calcite基础和Calcite的服务层、校验层、优化层等核心内容。不同需求层次的读者都可在这本书中找到属于自己的“宝藏”。请不要错过,相信你一定会受益良多!

——林春,某数字金融有限公司首席数据库专家

大数据时代,越来越多的计算引擎将Calcite作为其SQL解析与处理引擎,如Hive、Drill、Flink。Apache Calcite在数据管理方面拥有着得天独厚的优势,它能为不同的计算引擎和数据源提供统一的查询,并提供一站式的解决方案。这本书从SQL的解析、校验到优化,层层递进,深入浅出,非常值得数据领域开发者和大数据从业者深入研究和学习。

——冯若航,PostgreSQL中文社区开源技术委员会委员


我在2005年加入IBM中国开发实验室,在实验室从事过8年数据库引擎研发,同时为国内银行、电信等重要客户提供数据库设计开发和运维服务。我在2014年加入中信银行数据中心,带领团队承担全行的数据库运维管理职责。由于我的数据库工作经历,我深刻意识到:当前以金融科技为代表的重大技术变革已经深入并改变了整个行业。这在很多方面都有明显的体现,例如与开发相关和基础环境相关的技术体系和架构、分布式技术、云计算技术、大数据技术等新一代技术已经在银行业落地生根;而科技基础设施方面,正在从以IOE为代表的传统技术架构(以IBM为代表的主机,以Oracle为代表的关系型数据库,以EMC为代表的高端存储设备)转向以各种分布式技术、开源技术为主体的开放性架构,其中数据库始终是这一过程中最困难的一项。

但是,在数据库技术变革的过程中,万变不离其宗,不同的数据库都提供了对标准SQL(Structured Query Language)的支持。它最早是IBM圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL得到了广泛的应用。如今无论是像Oracle、IBM Db2等这些大型的数据库管理系统,还是像阿里OceanBase、中兴通讯GoldenDB、华为GaussDB等分布式数据库,都支持SQL作为查询语言。

目前,美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。SQL之所以能成为国际标准,其中重要的原因在于SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存储方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL作为数据输入与管理的接口。

Apache Calcite是一个开放源代码动态数据管理框架,该框架已由Apache软件基金会许可,并使用Java编程语言编写。作为一款开源SQL解析工具,它一方面极大地降低了开发人员运用SQL的入门门槛;另一方面,它实现了自己的SQL查询优化模型,方便不同数据源的数据查询和计算。

本书作者刘钧文、悟初境、孙潇俊具有丰富的从业经历,一直从事Calcite相关的技术工作。特别是钧文,我和他在第十二届中国数据库技术大会(DTCC2021)上相识,通过交流,我发现钧文性格开朗,好学上进,特别是精通Calcite的底层技术,这本书也体现了作者在这方面拥有的极其难得的经验和知识。

今天,国内已经有越来越多的技术人员在使用Calcite,这本书值得广大从业人员学习和借鉴,希望这本书能成为广大读者的良师益友,为你答疑解惑,点亮前进之光。现在,有幸先读并写下感想,特此推荐给大家。

中信银行数据库团队负责人

王飞鹏

2021年10月24日


在学生时代,就听说几大传统关系数据库管理系统产品不可替代,其中一个重要因素就是它们积累了深厚的查询优化技术功底。如果仔细翻阅数据库管理系统的教材,还会看到联邦数据库等内容。

2011年,我参与了国家“核高基”重大专项《非结构化数据管理》,当时的一个关键任务就是如何能够支持多种数据源的查询优化,并支持OLTP和OLAP等功能丰富的查询。在亲手编写了数据库管理系统的查询引擎后,我更加深刻感受到查询优化器的功能丰富与实现不易。后来,在一系列纵向课题中依然出现诸如“多源异构数据管理”的关键词和任务。这让我十分期待一个成熟、丰富的查询优化器组件。

随着Apache Hive等项目对SQL查询优化器实现的不断完善,Apache Calcite的大名也开始越传越远。这样一个组件的诞生,最大限度避免了各个项目在查询优化器部分“重复造轮子”;同时,通过开源协作,功能越来越丰富的Calcite简直可以成为学生学习数据库查询引擎原理的重要工具。

2019年,我请组里学生开始尝试使用Calcite为时序数据库Apache IoTDB提供关系模型与标准SQL接口,才发现彼时尚无完整、全面的Apache Calcite中文图书。后来,钧文告诉我他们撰写了Apache Calcite数据管理一书,我认为这本书出现得可谓及时。

Apache Calcite很好地总结并吸收了过去数十年来的优秀数据库查询技术,同时也为一系列数据存储引擎、数据中台软件提供了一种增强与集成方式。期待这本书能让读者走近数据库查询引擎,走出“重复造轮子”的怪圈,走入高效多源异构数据管理的新时代。

清华大学助理研究员,中国通信学会高级会员,大数据系统软件国家工程实验室成员

黄向东

2021年10月23日


在当前数字化的浪潮中,各行各业都在经历现代数字技术的洗礼。在这个过程中,一方面,数据的规模在急剧扩大,另一方面,数据在不断集成。原先数据分属于不同的公司、不同的部门,但如今,为了能够更为有效地支持上层越来越复杂的业务需求,往往需要将大量不同类型的数据库“捆绑”在一起使用,这样会导致“缝合”成本非常高,软件工程师需要适配不同类型的接口,开发进度慢,而且代码难维护,bug频出。

这些问题在智慧城市这个领域显得尤为突出,因为在相关的数字基础设施建设中,往往需要将政府相关部门的数据、公司的用户数据、外部的开源数据进行集成。一方面,它们的数据量非常大,而且增长迅速,实时动态更新;另一方面,它们的数据结构是非常多样的,有传统的表格数据、描述地理位置的空间数据、记录声音的音频数据、记录图像的数据以及视频数据等。在以往每一种数据都由专门的数据库来存储和管理,但是如今需要快速搭建一个集成系统来对这些数据进行存储和管理,而搭建这样的系统并非易事。

作为智慧城市领域的从业者,我们在实际的开发工作中,同样会面临这样的问题,在反复的“挣扎”中,也一直希望能够有一个组件,一方面可以对接多种数据源,满足我们实际的业务需求;另一方面只暴露一个统一的接口,让开发人员不必再纠结于各种各样的数据读写方式。

Calcite无疑就是这个问题的答案,一方面,它使用关系代数这个经过验证的数据管理模型,使我们能够通过最普通的SQL来对它进行调用;另一方面,它提供插件化的配置方式,能够允许我们很快地接入大量异构的数据源。除此以外,Calcite是用Java编写的,对很多软件开发人员来说,这无疑是一个福音。因为很多主流后端框架也是使用Java来进行开发的,所以Calcite可以非常方便地集成到里面。

虽然Calcite本身价值很高,也成为很多开源组件(例如Hive、Flink等)的查询优化核心,但是因为其与传统互联网业务“距离”较远,从业人员并未对其予以足够重视。这样就导致,当业务突然变得非常复杂时,软件工程师只能不断“缝合”新的数据源,最终难以管理庞大的项目。因此我们认为,写这样一本介绍Calcite的书,将它推荐给更多的软件工程师,是可以帮助他们解决很多实际问题的。

除了希望能够帮助软件开发人员快速上手,我们更希望能够帮助软件工程师、高校的学生以及相关的研究人员更加深入地了解Calcite的原理。对软件开发人员来说,将原理理解透彻,能够帮助他们找到更好的系统优化方案;对学生来说,通过结合Calcite来学习原理,能够增进对数据库的理解;对相关研究人员来说,不仅能够找到更多研究角度,也能够以更快的速度来搭建原型程序,展示研究成果。

由于书中涉及的知识点较多,难免有疏漏之处,欢迎广大读者批评、指正,并多提宝贵意见。

本书分为3个部分。

第一部分:历史背景、基础理论与入门(第1章~第4章)。

第二部分:分章介绍Calcite的各个模块(第5章~第13章)。每一章都穿插代码实践,建议读者结合附书代码完整运行一遍。

第三部分:Calcite在开源项目中的使用(第14章)。

建议读者先阅读第一部分,以对Calcite的历史有简单的了解。第二部分中,第5章~第9章属于核心内容,建议读者按顺序阅读;第10章~第13章属于Calcite的扩展功能,读者可以按需阅读。最后一部分相对独立,有少量开源组件的源码分析,需要读者具备一定的Calcite基础和使用经验。当然,假如你阅读某些章节遇到问题,可以很容易地找到前置知识,书中会有相应的提示。

附书代码是一个Maven项目,按照章分成多个模块,每一章可能有多个子模块。将项目子模块导入类似IntelliJ的IDE即可自动构建。

第1章介绍Calcite的发展历史。数据库已经存在很长时间,但在数据管理和大数据的发展过程中,多源数据融合的问题凸显。所有数据都可以通过SQL来查询,却缺少一个能够统一多个数据源的框架,由此Calcite应运而生。基于十几年的发展,Calcite已经应用到多个主流开源软件,逐渐趋于成熟和稳定。

第2章从架构层面对Calcite进行简单的讲解。Calcite聚焦SQL的查询优化,同时基于适配器模式接入各种数据源。除此以外,Calcite还支持流式查询。Calcite虽然是一个框架,不过借助周边生态,从Avatica搭建服务到各种语言的客户端,可以很快“拉起”一套服务。不管是独立运行,还是作为依赖的工具库,其运行流程都很简单、清晰。

第3章相当于Calcite快速上手“教程”。我们从使用者和开发者角度分别给出示例。使用者可以通过SQLLine命令行工具快速接入CSV数据,利用SQL对这些数据进行操作,对于“尝鲜”的用户非常方便。对开发者来说,通过配置元数据和数据源等信息,让Calcite能够对CSV文件进行查询。

第4章讲述数据库查询优化的理论基础。从数据库优化器的整体结构出发,分为语法解析、元数据校验、逻辑计划优化、物理计划优化、物理执行几个部分。逻辑计划优化基于关系代数,本质是集合关系的操作,常见的逻辑计划优化为谓词下推、常量折叠、列裁剪和条件简化;物理计划优化与硬件资源和数据集大小相关。本章主要讲解优化部分的理论基础,熟悉这部分内容的读者可以选择性阅读。

第5章对Calcite的服务层进行介绍。服务层的任务就是担任接收请求的常驻服务,主要由Avatica模块承担这个工作。因此,我们对Avatica的RPC架构进行源码分析,理解它是如何实现JDBC框架的,并尝试其3种鉴权方式。数据库的访问不是直接调用后端接口数据那么简单,还需要针对不同语言封装对应的接口。所以我们介绍Java和Python语言的客户端驱动以及如何通过自定义客户端来专门访问Calcite。除此以外,Calcite也支持命令行的访问方式。

第6章介绍Calcite的解析层,该层是Calcite不可缺少的部分。本着不“重复造轮子”的原则,Calcite采用业界比较成熟的JavaCC来进行解析器的生成。虽然Calcite官方只使用了JavaCC,但是我们会介绍另一个使用更广泛的解析框架Antlr,并且使用2种框架来实现同样的示例。这样做一方面是为了说明Calcite本身的扩展性,另一方面是为了给读者提供更多的选择。最后我们将JavaCC和Antlr进行对比。读者可以按需选择适合自己的解析框架。

第7章介绍Calcite的校验层。所谓校验,就是结合元数据来发现SQL语句中的语义错误。因此,本章分为2个部分,首先是元数据定义,主要讲述Calcite的元数据模型;然后是Calcite的校验流程,先从源码层面分析校验的基础,然后以一个例子分析校验流程。通过本章的学习,我们才能得到相对正确的SQL语法树,并将其交给优化层优化。

第8章介绍Calcite的优化层,该层是Calcite最核心的部分。SQL执行速度的快慢,很大程度取决于查询优化结果的好坏。本章从理论和实践出发,一步步将优化的细节展示出来。如何对算子树进行规则优化,再进行代价优化,这些问题都会在本章给出答案。同时,本章将深入地解析Calcite优化的源码,并给出自定义优化规则的方式,读者可以根据自己的应用场景扩展优化功能。

第9章介绍如何在Calcite中接入新的数据源,这也是Calcite的一个亮点。只要编写一个适配器,就能对数据进行SQL操作,官方已经提供了不少数据源的适配器。本章以不同结构的数据源为例详细描述接入步骤。首先介绍键值数据库的代表Redis,然后介绍关系数据库的代表PostgreSQL。后者因为支持复杂的SQL,所以需要编写更多代码实现谓词下推;而Redis本身不具备过滤功能,只能在内存里运算。本章最后描述了Calcite是如何利用动态代码生成技术完成执行操作的。

第10章介绍SQL扩展功能,这实际上是介绍SQL支持的更复杂的功能,主要包括用户自定义函数、用户自定义聚合函数、用户自定义表函数。本章会对每种函数进行详细的介绍,并且描述自定义的方式。

第11章介绍空间数据查询,这是Calcite后来支持的功能,也是随着时空数据的发展,逐步将GIS相关的查询融入数据库的结果。Calcite遵循OGC标准,实现了该标准的部分函数。对于Calcite,无非就是增加一些空间数据类型,所以本章着重说明Calcite中如何扩展数据类型,对于想深度改造Calcite的用户会有帮助。

第12章介绍流式处理,这是Calcite扩展功能中的一个亮点。流式处理是随着实时和流式场景的出现而发展起来的,不过Calcite对流式的查询刚刚开始,还未达到生产条件,所以读者将之作为一个可以尝鲜的功能进行了解即可。

第13章对视图进行说明。视图在Calcite中相当于逻辑表,与传统数据库中的视图定义无异。同时Calcite也支持物化视图,不过笔者未发现项目对Calcite的视图功能的广泛应用,从实现来看其视图也并不成熟。

第14章介绍Calcite在开源项目中的使用方法。为了帮助读者更方便地理解在具体项目中如何使用Calcite,本章分析3个开源项目——Hive、Kylin和Flink,它们都使用Calcite作为查询优化的核心模块。其中Hive主要面向的是离线数仓的应用场景,Kylin主要面向的是多维数据分析场景,Flink主要面向的是实时数仓的应用场景。读者可以尝试深入分析它们的源码,会有惊喜发现。

正如计算机最常见的分层架构,我们也是一层层地讲解Calcite的实现过程。阅读本书最重要的是结合源码分析,因为数据库的很多理论知识是非常抽象的。不过Calcite作为一款优化器框架,其源码也非常具有学习价值。同时,实践也是必不可少的。希望在学习本书并将Calcite应用付诸实践后,读者能够解决数据源统一管理的问题,助力企业数字化转型。

本书是整个编著团队通力合作的结果,并由我们三人共同撰写。此外,京东城市时空数据引擎团队的李瑞远、隋远、吴伟、谭楚婧、刘京晖、王顼、刘菲、胡建、朱浩文、王如斌、何天赋、何华均、俞自生、刘军、刘宏阳、任慧敏等也对这项工作提供了帮助,在此一并致谢。

刘钧文,悟初境,孙潇俊

2021年9月3日

中国 北京


本书由异步社区出品,社区(https://www.epubit.com)为您提供相关资源和后续服务。

本书提供代码仓库文件,要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面(见下图),单击“提交勘误”,输入错误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit. com/selfpublish/submission即可)。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT图书的品牌,依托于人民邮电出版社近40年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号


20世纪40年代以来,人类逐渐进入“信息化时代”,数据管理和应用技术层出不穷。随着人类社会的不断发展,人们对于数据管理的需求在不断变化,相应的数据管理技术也在不断发展。从早期使用文件来进行数据管理,到后面的单机版关系数据库的出现,接着为了应对海量数据的管理而出现了分布式数据管理系统,再到如今的多元数据融合。每一次技术更迭,都能够听到人类社会发展的脚步声。

然而,到如今,随着各行各业逐渐走上数字化转型的道路,原有的技术陷入非常多的困境。一方面,需要将原有的千奇百怪的数据结构进行统一,使其在共同框架下进行更为复杂的计算;另一方面,需要让更多的人能够利用通用的数据操作方式来进行数据的计算和管理。

对于解决这些问题,Calcite做出了非常重要的贡献。一方面,Calcite可以对不同的数据源进行统一的管理;另一方面,它利用结构化查询语言(Structured Query Language,SQL)这种非常简单的数据操作语言,非常便捷地实现对不同数据源的统一计算和管理。

作为时空数据引擎的开发人员,我们经常会接触到不同行业的数据,按照很多传统的组件,往往需要对不同行业的数据进行单独的处理,非常麻烦。而接触Calcite以后,我们瞬间就被其便捷性、扩展性深深吸引,有时甚至会拍案称奇。那么Calcite究竟是什么呢?它在数据管理的历史长河当中扮演了什么样的角色呢?看官莫慌,且听我们细细道来。

数据管理系统是人们用来组织、存储和检索数据的技术。人们管理和存储数据最早是使用“打孔卡”的方式来实现的。图1-1展示了在IBM 402上使用的穿孔卡片,其历史可以追溯到100多年以前。1890年,赫尔曼·霍利里思(Herman Hollerith,见图1-2)将打孔卡与织布机结合,用作机械制表机的存储器,至此数据库诞生了。

图1-1 在IBM 402上使用的穿孔卡片(源于快科技网站)

图1-2 赫尔曼·霍利里思(源于UC电脑园网站)

在数据库的发展过程中出现了非常多优秀的数据库产品,比如Oracle、MySQL、PostgreSQL等。

随着数据量的不断增加,数据结构变得越来越多样,传统的关系数据库面临巨大的挑战。为了管理海量的非结构化数据,NoSQL(Not Only SQL,泛指非关系数据库)数据库出现了。NoSQL数据库有速度快和使用灵活等特点,它们在很多非表格类场景当中,往往比传统关系数据库更可取。甚至在表格类数据超出一定数据量以后,传统关系数据库无法满足应用需求,需要使用NoSQL数据库来替换。在这个背景之下,针对不同业务场景的NoSQL数据库产生了,有基于Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)的键值数据库HBase,有面向全文检索场景的Elasticsearch,有文档数据库MongoDB,等等。现在的关系数据库和NoSQL数据库俨然已经成为两大阵营,都有其具有代表性的产品。图1-3展示了关系数据库和NoSQL数据库的产品。

图1-3 关系数据库和NoSQL数据库的产品

如今,情况又发生了非常大的变化。随着各个行业数字化转型脚步的加快,原有不同行业内部使用的数据管理系统面临整合,其中的核心是如何让开发人员便捷地整合不同结构的数据,完成查询和计算任务。

在这个大背景下,Calcite作为一个支持多种数据源进行统一查询和计算的数据库优化器,迅速地脱颖而出。一方面,Calcite使用SQL作为与开发人员进行交互的查询语言,极大地降低了开发人员的入门门槛;另一方面,它实现了自己的查询优化模型,数据源可以作为插件灵活地注册到其中,实现不同数据源的数据查询和计算。因此,很多有影响力的开源数据仓库(后文简称数仓),例如基于MapReduce的离线框架Hive,主打实时数据处理的Flink,等等,都用Calcite作为自身查询优化的核心组件。

而且,当今的软件生态中,开源项目逐渐成为主流。所谓开源,不仅指软件源码的开放,还指活跃的社区、更高的关注度、更广泛的传播。Calcite作为Apache软件基金会的顶级项目之一,无疑已经成为开源生态项目当中的佼佼者。依靠其强大的功能,Calcite不仅支持了Hive、Flink等开源组件的核心功能,也支撑了诸如阿里巴巴集团的MaxCompute、腾讯公司的SuperSQL等商业产品,进一步走入万千企业。

说起Calcite,不得不提及它的创始人朱利安·海德(Julian Hyde),他在多家数据平台公司都有非常亮眼的工作经历。他曾经是Oracle和Broadbase公司SQL引擎的主要开发者、SQL Stream公司的创始人和主架构师、Pentaho BI套件中OLAP(Online Analytical Processing,联机分析处理)部分的架构师和主要开发者。除此以外,他还是开源数据库的爱好者,主导开发了很多关于数据库的开源组件。无疑Apache Calcite是其中最为耀眼的一个,无论是项目的功能性、成熟度,还是行业的影响力,Calcite都表现得非常出色。

Calcite的发展是一个很漫长的过程,根据Calcite早期的一次技术分享内容,其根源可追溯到一款面向OLAP的数仓——LucidDB。它是一款面向列存储,利用Bitmap(位图算法)构建索引,支持基于哈希算法的连接和聚合功能以及页面级别的多版本控制的开源产品。这款产品最早发布的版本是2005年7月7日的eigenbase_r0.5.0,到2012年已经停止维护。作为一款商业智能(Business Intelligent,BI)产品,它能够支持海量数据导入、索引和查询。但是随着大数据生态的不断变化以及开源生态的蓬勃发展,LucidDB逐渐没落。我们认为很重要的一个原因是其很多模块都选用了具有强传染性的GPL(GNU General Public License,GNU通用公共许可证)2.0协议,“闭源”色彩较浓,因此逐渐失去了在业界大范围传播的机会。

LucidDB虽然没落了,但是其选用的优化组件Optiq却走出了不一样的道路。Optiq的意思是“优化”,也表明了其核心功能。它是一款使用Java开发的基于关系代数(Relational Algebra)理论的数据库查询优化器,也是朱利安·海德个人主导的一个项目。为了达成查询优化功能的内聚,Optiq实现了如下特性:

这些特性一直沿用至今,成为Calcite当前非常重要的核心特性。在当时Optiq社区开发人员的不断努力下,Optiq已经可以支持多种数据源,例如Drill、Lingual、CSV、MongoDB、Spark、Splunk等。随着Optiq功能的不断完善,它也获得了越来越多用户的认可,在很多有影响力的技术会议中都进行了相应的技术分享,例如2012年的Splunk用户大会(Splunk User Conference)、2013年的当代NoSQL大会(NoSQL Now Conference)以及2014年的Hadoop尖端论坛(Hadoop Summit)等。

经历了前期数年的发展,Optiq逐渐成长起来,也引起了Apache软件基金会的注意。凭借其自身优秀的功能和逐渐提升的行业影响力,2014年5月25日,Optiq正式成为Apache项目,并进入Apache软件基金会孵化器进行孵化。同年的9月30日,Optiq正式改名为Calcite,也就是本书的主角。

在这个时期,基于Optiq原有的特性,Apache Calcite在功能性、扩展性、适配性方面都有了非常大的进步。

首先为了支持更多的数据源,Calcite支持了非常多的适配器(Adapter),例如Cassandra、Druid、Elasticsearch、Kafka等。在数据的流式处理方面,Calcite提供了相关的流式处理方法;在空间处理方面,它不仅实现了开放式地理信息系统协会(Open Geospatial Consortium,OGC)规范的查询方法,还实现了基于Hilbert空间填充曲线的空间索引。

除了自身功能的完善,该项目也走出了早期由朱利安·海德个人主导的“小作坊”模式,更多的“职业玩家”加入进来,除了朱利安·海德所在的Hortonworks公司,MapR、Salesforce、阿里巴巴、华为这样的“大数据时代”的“巨头”也纷纷成为建设Calcite的一员。

在Calcite快速发展的过程中,其项目也变得越来越大。但是,“大”也有“大”的烦恼,不同模块的发展速度出现了不同程度的错位。在这个背景下,2016年5月3日,Calcite社区决定将迭代速度较快的JDBC(Java Database Connectivity,Java数据库连接)的驱动部分拆分出来,命名为Avatica,作为Calcite项目的一个子项目单独维护。这次拆分并没有让Avatica脱离Calcite项目的管辖,而是将这两个模块进行了进一步的解耦,使Calcite和Avatica都能够以更快的速度进行迭代。

可以预见的是,随着Calcite的各个模块内容的不断充实,还会有更多的模块以子项目的形式,从Calcite主干项目里面独立出来,以适应当前IT行业的敏捷开发的趋势。

Calcite如今已经发展成为一个非常庞大而且生命力非常旺盛的生态系统。

从内部来看,Calcite以calcite-core模块为核心,能够读取多种数据源(如Cassandra、Elasticsearch等),挂载Linq4j或者Spark作为执行引擎,在解析层也支持JavaCC(Java Compiler Compiler,是一种可以生成语法和词法分析树的程序),在上层的服务提供方面,则由其子项目Avatica全权负责。对于可挂载的组件,Calcite提供了对应的适配器或者API(Application Program Interface,应用程序接口),而且如果用户需要添加新的组件,可以直接按照要求实现相应的接口,非常方便。这样的内部生态也正是实现“一条SQL语句管理所有数据源”的有力保障。图1-4展示了Calcite生态系统。

从外部来看,Calcite凭借其易用性和可扩展性,其本身的核心代码成为很多开源框架和商业大数据平台的首选优化器方案。

在商业公司里,阿里巴巴集团的MaxCompute平台是阿里巴巴飞天大数据架构体系中的重要组成部分,能够提供快速的、完全托管的PB级数仓解决方案,其中的查询优化组件就用到了Calcite;腾讯公司的TBDS平台也用到了Calcite来进行SQL解析和查询优化。

而在开源组件里面,使用到Calcite的组件更多。例如擅长处理实时数据的Flink,擅长分析和处理多维数据的Kylin,使用非常广泛的大数据数仓Hive。类似的组件还有很多,表1-1展示了Calcite官方在册的所有使用到Calcite的组件,在此不赘述。

图1-4 Calcite生态系统

表1-1 使用到Calcite的组件

支持的组件维护机构是否开源Calcite的作用
MaxCompute阿里巴巴集团优化查询计划
ApexApache解析流式SQL(Streaming SQL)和进行查询优化
BeamApache解析和优化SQL语句
DrillApache解析和优化SQL语句
FlinkApache解析和优化流式SQL
HiveApache优化查询计划
KylinApache解析和优化SQL语句
PhoenixApache解析和优化SQL语句,并且使用Avatica作为远程的JDBC驱动
SamzaApache解析流式SQL和进行查询优化
StormApache解析流式SQL和进行查询优化
AthenaXUber解析SQL和进行查询优化
TBDS腾讯公司解析SQL和进行查询优化

从前文可知,Calcite实现了一个全局统一的查询优化框架,该框架可以用来解决现下非常多的数据管理问题。然而Calcite的优势还不止于此。

(1)Calcite使用Java作为开发语言。现如今,Java已经成为服务端开发的主流语言。换句话说,程序员如果使用Calcite作为查询优化组件,能够很容易嵌入现有的服务应用当中。而且相对来说,由于Java语言的流行,其生态的扩展性也使Calcite如虎添翼。

(2)Calcite容易扩展。在很多位置,它都提供了通俗易懂的可扩展接口,给程序员带来了无限的可能性。相关的技术细节,后文会有详细的介绍。

(3)Calcite容易使用。由于它本身是参照了数据库的架构模式,因此其部署也是非常方便的,而且还有SQLLine这样的前端组件(同样是由朱利安·海德主导开发的),Calcite基本上能够实现开箱即用。

(4)Calcite实现了一套完整的关系数据模型,其严谨的数学模型有助于使整个查询优化过程更加精准。同样,对于关系代数的操作符,它也提供了相关的扩展接口,程序员可以自定义操作符来对关系运算进行控制。

(5)Calcite实现了流式SQL。这也是一大亮点,因为当今的数据处理领域已经不是以往那样仅需对批量数据进行查询和计算了,对流式数据的处理也有大量的需求。Calcite的这一功能可谓非常地应景。

(6)Calcite多年的生态建设。从2014年至今,Calcite逐渐从一个孤立的组件成长为一个Apache顶级项目,由于其强大的行业影响力和过硬的产品品质,吸引了包括Intel、Oracle、Hortonworks、阿里巴巴、腾讯、华为等科技公司的加入。“众人拾柴火焰高”,众多高质量贡献者共同将Calcite推到了前台,Calcite成为如今各大公司进行数据平台开发时查询优化领域的首选。

本章首先介绍了数据管理系统的发展历史及其面临的问题,从这个问题引出了Calcite,它的出现解决了如今不同数据源之间“查询难”的问题。但是“罗马不是一日建成的”,Calcite同样经历了从零到一,再到丰饶多样的生态系统的整个过程。本章最后讲述了为什么使用Calcite,以及它能够做什么事情。那么,它是如何实现的呢?它的内部架构是什么样的呢?具体内容请看第2章。


相关图书

SPSS医学数据统计与分析
SPSS医学数据统计与分析
首席数据官知识体系指南
首席数据官知识体系指南
大数据实时流处理技术实战——基于Flink+Kafka技术
大数据实时流处理技术实战——基于Flink+Kafka技术
大数据安全治理与防范——流量反欺诈实战
大数据安全治理与防范——流量反欺诈实战
搜索引擎与程序化广告:原理、设计与实战
搜索引擎与程序化广告:原理、设计与实战
医疗大数据挖掘与可视化
医疗大数据挖掘与可视化

相关文章

相关课程