Apache Calcite是一款开源的动态数据管理框架,提供了标准的 SQL 语言、查询优化和连接各种数据源的能力,但不包括数据存储、处理数据的算法和存储元数据的存储库。
Calcite 最早的名称叫做optiq,起初在Hive 项目中,为Hive 提供CBO代价优化。2014年5月optiq独立并成为Apache社区的孵化项目,2014年9月更名为Calcite,2015年10月正式毕业成为顶级项目。
Calcite 的目标是"One planner fits all",期望能为不同的计算平台和数据源提供统一的查询优化器。作为一个通用的SQL处理层,Calcite 被众多的开源组件和公司广泛使用。相较于另一款开源的SQL中间件GPORCA(Greenplum扩展优化器),Calcite具备更加丰富且成熟的功能,目前社区仍在活跃更新。
Calcite的整体架构如下图所示,其中,最为核心的组件是查询优化器(Query Optimizer),负责实现SQL计划树的转换和优化,优化器的SQL优化能力与执行效率直接相关,是SQL处理层的重点和难点。Calcite的查询优化器主要依赖以下三个组件:
为实现完整的SQL处理流程,Calcite还包括JDBC Server、SQL解析器和验证器,表达式构建器。Calcite对外主要提供两种调用方式:1. 基于JDBC调用;2. 直接基于Java API调用。
Calcite对外提供了丰富的的API和SPI,主要包括以下六个模块:
除了作为计算引擎的SQL处理层,Calcite还可以为其他SQL中间表示层(IR层)提供扩展处理能力。基于Calcite扩展的常见SQL IR层组件有 Linkedin Coral 和 Substrait。
LinkedIn Coral:是Linkedin开源的SQL转换、分析、改写组件,提供多类型SQL方言转换功能。Coral IR层有两种定义方式:(1). 基于AST抽象语法树;(2). 基于逻辑计划。
Coral内核基于Calcite扩展了SQL优化和方言转换功能,下图展示了两个组件之间的交互关系,其中蓝色表示Calcite模块:
Substrait:基于Proto Plan定义跨语言关系代数的序列化协议,核心是定义SQL计划树的规范,使得这些计划树可以在不同的执行引擎之间进行转换和优化,解决不同引擎间互操作性差的问题。
Substrait-java是针对Substrait的Java子项目,便于在Java应用中操作Substrait的计划树。Substrait-java 基于Calcite完成SQL到关系代数RelNode的转换,下图展示了两个组件之间的交互关系,其中蓝色表示Calcite模块:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。