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 包含三个组成部分:

  1. rules(匹配规则):
  2. metadata providers:
  3. 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:

  1. Apache Calcite:Hadoop 中新型大数据查询引擎
  2. Apache Calcite 论文学习笔记
  3. Apache Calcite 处理流程详解(一)
  4. MaxCompute Query Optimization with Calcite
  5. SQL for NoSQL and how Apache Calcite can help