SQL引擎-Calcite 设计与实现
一、概述
Apache Calcite 是一个动态数据管理框架,包含了数据库管理系统的许多组成部分,但省略了存储原语。提供了一个行业标准的 SQL 解析器和验证器,一个可定制的优化器,具有可插拔规则和成本函数,逻辑和物理代数运算符,从 SQL 到代数(以及相反)的各种转换算法,以及许多适配器,用于在 Cassandra、Druid、Elasticsearch、MongoDB、Kafka 等系统上执行 SQL 查询。
二、设计
Apache Calcite 的设计目标之一就是提供一套通用的 SQL 查询处理框架,使得可以使用一套代码来处理各种类型的数据源,包括关系型数据库、图数据库等
2.1. 服务层模块
Calcite 接收请求的第一站就是服务层组件,这一部分组件如今已经独立出来成为一个单独的开源项目 Avatica,Avatica 对 JDBC 协议进行了封装,将用户的 SQL 请求转发给 Calcite-core 组件进行进一步的解析、校验、优化和执行。
- 接收客户端的 SQL 请求
- 校验用户的配置信息
- 转发给 calcite-core 模块执行
- 封装结果请求并返回。
服务层组件将 SQL 请求接收以后,会将相关的信息发给 Calcite 内部,正式开启整个 SQL 的执行流程。
2.2. Core 模块
2.2.1. SQL 解析器
使用JavaCC 生成的解析器进行词法、语法分析,得到 AST
用户请求经过 Avatica 的接收和封装被传递给 Calcite-core 模块。其中第一站就是解析层,它的作用主要是对 SQL 语句进行语法解析。在这个过程中,初始的SQL 字符串会被转化力 Calcite 内部的语法解析节点,为进一步的语法校验和优化做准备。
JavaCC
Antlr4
Babel
Babel 通过扩展 Calcite 的解析器功能,将各种不同的 SQL 方言解析为 Calcite 的内部逻辑表示,支持多种标准和非标准的 SQL 语法。使开发人员可以在 Calcite 中处理多种 SQL 语法,而不需要为每种数据库方言单独编写解析器,使 Calcite 能够在其查询优化和执行过程中使用统一的查询表示。
2.2.2. 校验器
数据管理系统需要完备的元数据、数据模型对其管理的数据进行规约。在 Calcite 当中,这些规约和校验的任务是由校验层来完成的。
在 Calcite 中,校验器主要将解析层转换的 SqlNode 结合元数据信息,转换成 RelNode 信息。
2.2.3. 优化器
将 AST 转化为逻辑执行计划,并根据特定的规则进行优化;
2.2.4. 执行引擎
Calcite 提供了一个可扩展的执行引擎框架,允许将查询计划映射到特定数据源的执行引擎,使 Calcite 可以集成到不同的数据存储系统中,以执行查询操作。
将逻辑执行计划转化成引擎特有的执行逻辑,比如 Flink 的 DataStream
2.2.5. 连接器
Calcite 提供了一些默认的连接器,用于连接到常见的数据源,如关系数据库、CSV文件、JSON文件等。同时,也支持自定义连接器,以便与其他数据源集成。