Apache Calcite
希望能为不同计算平台和数据源提供统一的查询引擎,并以类似传统数据库的访问方式来访问 Hadoop 上的数据。除此之外,Calcite
还提供了 OLAP 和流处理的查询引擎。
Apache Calcite具有以下几个技术特性:
- 支持标准 SQL 语言;
- 独立于编程语言和数据源,可以支持不同的前端和后端;
- 支持关系代数、可定制的逻辑规划规则和基于成本模型优化的查询引擎;
- 支持物化视图( materialized view)的管理(创建、丢弃、持久化和自动识别);
- 基于物化视图的Lattice 和Tile 机制,以应用于OLAP 分析;
- 支持对流数据的查询。
Calcite
提供了标准的 SQL 语言、多种查询优化和连接各种数据源的能力。从功能上看它有很多数据库管理系统的典型功能,比如 SQL 解析、SQL 校验、SQL 查询优化、SQL 生成、数据连接查询等等,但却不包括数据处理、数据存储等 DBMS 的核心功能。正因为 Calcite 这种与数据处理和存储的无关的设计,才使它成为在多个数据源和数据处理引擎之间进行协调的绝佳选择。
Calcite 的主要功能是 SQL 语法解析(parse)和优化(optimazation)。首先它会把 SQL 语句解析成抽象语法树(AST Abstract Syntax Tree),并基于一定规则或成本对 AST 的算法与关系进行优化,最后推给各个数据处理引擎进行执行。
Apache Calcite定位为一个完整的查询处理系统,但 Calcite 的设计是非常灵活,实际项目中一般有两种使用方式:
- 把 Calcite 当作库,嵌入到项目中。
- 实现一个适配器,通过读取数据源的适配器与 Calcite 集成。
Calcite 的优化器使用关系运算符树作为其内部表示,其内部优化引擎主要由三个组件组成:规则、元数据提供者和规划引擎。图中虚线表示 Calcite 与外部的相互作用,从图中可看出这种相互作用的方式有多种。
- 解析(Parser),Calcite 通过Java CC 将 SQL 解析成未经校验的的 AST。
- 验证(Validate),该步主要作用是校验上一步中的 AST 是否合法。
- 优化(Optimize),该步主要作用是优化 RelNode 树,把它转化成物理执行计划。
- 执行(Execute),这一步主要做的是把物理执行计划转换成可在特定平台执行的程序。
Calcite 还引入 Lattice(格子)和 Tile(瓷片)的概念。Lattice 可以看做是在星形模式数据模型下对物化视图的推荐、创建和识别的机制。这种推荐可以根据查询的频次统计,也可以基于某些分析维度的重要等级。Tile 则是 Lattice 中的一个逻辑的物化视图,它可以通过三种方法来实体化:1)在 lattice 中声明;2)通过推荐算法实现;3)在响应查询时创建。
Calcite
架构最核心地方就是 Optimizer
, Optimization Engine 包含三个组成部分:
- rules(匹配规则):
- metadata providers:
- planner engines:
类型 | 描述 | 特点 |
---|---|---|
RelOptRule | transforms an expression into another | |
ConverterRule | Abstract base class for a rule which converts from one calling convention to another without changing semantics | |
RelNode | relational expression | |
Converter | A relational expression implements the interface Converter to indicate that it converts a physical attribute, or RelTrait of a relational expression from one value to another | |
RexNode | Row-level expression | |
RelTrait | RelTrait represents the manifestation of a relational expression trait within a trait definition | |
Convention | Calling convention used to repressent a single data source, inputs must be in the same convention | |
RelTraitDef | ||
RelOptCluster | An environment for related relational expressions during the optimization of a query | |
RelOptPlanner | ||
RelOptCost | defines an interface for optimizer cost in terms of number of rows processed, CPU cost, and I/O cost |
- Catalog - Defines metadata and namespaces that can be accessed in SQL queries
- SQL parser - Parses valid SQL queries into an abstract syntax tree (AST)
- SQL validator - Validates abstract syntax trees against metadata provided by the catalog
- Query optimizer - Converts AST into logical plans, optimizes logical plans, and converts logical expressions into physical plans
- SQL generator - Converts physical plans to SQL
JavaCC
JavaCC
用来处理语法文件(jj)生成解析代码,JJTree
用来处理jjt文件,生成树节点代码和jj文件,JJDoc
根据jj文件,生成文本本件(Html)
JavaCC
是一个词法分析生成器和语法分析生成器。词法分析和语法分析是处理输入字符序列的组件,编译器和解释器协同词法分析和语法分析来解码程序文件。词法分析器
可以把一连串的字符序列划分成一个一个的叫做Token
的序列,同时它也可以把这些Token分类。这些Token序列将会传送给语法分析器以供其决定程序结构。JavaCC
的输入文件是一个词法和语法的规范文件,其中也包括一些动作的描述,它的后缀应该是jj。
.jj文件基本语法
词法部分声明:SKIP、TOKEN、SPECIAL_TOKEN、MORE。
SKIP用来说明被忽略的串。
TOKEN用来说明在词法层次上识别的token。
#开头的token只是在词法分析时使用,不能作为语法分析的输入,相对词法分析是局部的。
Reference: