Advertisement

Calcite技术研究

阅读量:

原文作者:王长春,来自平安银行零售大数据团队

概述

Apache Calcite是一个功能全面的基础软件平台,在支持高效的数据操作和分析方面表现突出。该框架不仅提供强大的数据处理能力,并且能够通过智能算法实现复杂业务逻辑的有效执行。具体而言,在数据检索效率、存储架构优化以及语义分析能力等方面均有出色表现。众多广受欢迎的开源数据分析平台广泛采用该技术作为其核心组件

该图表采用了Apache Calcite开源数据处理系统,并且该系统能够连接到可用的数据源。

大多数数据处理系统主要采用Calcite技术来进行SQL解析功能的实现,并通过该技术提升查询性能水平。一部分系统则选择Avatica(Calcite官方支持的一个子项目)作为开发自定义JDBC驱动的核心技术基础。另外一部分系统则利用Calcite技术对原有查询请求进行重新编写,并通过引入物化视图机制来进一步提高系统的运行效率

近年来,在数据处理领域中开发出了众多专门用于数据处理的引擎系统。如分布式存储架构、流式处理引擎以及基于索引的信息检索技术等其他类型搜索引擎都已出现并得到了广泛应用。这些系统声称在某些特定领域能够提供较高的性价比,并断言'一刀切'模式的时代已经结束。Spark、Storm、Flink等众多流式计算框架的成功应用证明了这一观点。

这些数据处理引擎都面临着一些共同但是难以解决的问题。

  • 首先是说数据处理引擎都需要进行Query优化工作,并提供SQL类型的Query语言或基于人工智能驱动的高级Query语言(DSL)。
    • 其次说明通常会采用多个专门的数据引擎来满足需求。例如,在实际应用中我们常会采用Elasticsearch、Apache Spark和DuckDB等数据库系统。这样一来,在面对异构化的数据源时用户会有更高的需求来支持统一的Query接口以及实施相应的性能优化措施。

Apache Calcite旨在解决这些问题而被构建出来。它具备所有数据处理系统所需的查询执行功能、查询优化技术和完整的查询语言支持。然而,在数据存储和数据管理方面的能力,并未由Calcite本身提供——这些功能是由各自的数据处理引擎独立实现的。除此之外,Calcite还提供了跨平台的查询优化能力以提升性能。

总结一下,Calcite在现在这么流行,主要原因如下:

  • 开源并完全遵循Apache基金会的规范运作。Calcite自2013年起便成为该组织的核心项目。
    • 基于Java开发的Calcite设计使其能够方便地整合到各种数据处理引擎中。
    • 强大的数据模型不仅支持流式数据处理引擎还能够适应传统的批式处理需求。
    • 针对优化器的设计实现了模块化架构包含规则管理和成本计算两大核心功能这一设计使整个系统具备了极强的灵活性。
    • 单一的数据平台之外Calcite还支持多种不同的数据存储解决方案能够执行查询操作同时也能对查询进行优化配置。
    • 提供了完整的ANSI标准SQL语句集合同时兼容多种数据库方言并且完全遵循JDBC规范提供了有效的驱动程序选项以满足不同数据库环境的需求。

Calcite架构

Calcite整合了多种典型的数据管理系统的组成模块。然而,它有意排除了一些核心组件,例如数据存储机制、处理算法以及元数据管理等关键部分。正是由于这一疏忽或设计缺陷,在实际应用中构成了钙石作为多套存储方案与多套处理引擎之间的中间平台。当然,它也为构建一个高效的数据处理引擎提供了基础架构

Calcite架构如上图所示。

Calcite优化器基于关系运算符树以特定形式存在。优化引擎主要包含规则组件、元数据提供者模块和planner engine部分。

Calcite具備一個分析模块與校验组件،將SQL query轉化為relationship operator tree structure. 由于Calcite缺乏存储層,它提供了一種mechanism...through adapters,定義external storage engine中的-table schemas與views(adapters將會在後文詳細介紹). 經此,應用程序即可使用calcite來接取external storage engine.

经过优化的查询, calcite仍能将优化后的关系表达式转换为SQL语句.这使得calcite能够与拥有SQL接口但不具备内部优化器的数据处理引擎良好地集成.

查询代数

3.1 运算符

基于关系代数的方法(Calcite)为核心构建了一个数据管理架构

3.2 Traits

Calcite未采用不同的实体分别对应逻辑与物理运算符;相反地,它利用traits这一概念来描述算子固有的属性特征,从而辅助优化器评估不同候选计划所需资源的数量与成本等指标,进而提高规划效率与性能表现.值得注意的是,即使对这些特性的赋值进行修改,也不会影响已计算出的结果数量及质量

在优化过程中,Calcite旨在通过关系表达式强制执行特定字段的数据排序等特性。为了指导这些操作的具体实现方式,系统允许用户配置并实现converter接口的功能

Calcite包含一些通用特质,这些特质表征了关系运算符(如ordering,grouping,partitioning)所生成数据的物理属性.Calcite优化器能够对这些属性进行推理并进一步发现那些无需处理的运算符.例如,如果sort运算符接受一个已经排序的数据集作为输入,那么该sort操作就可以被删除.

除了具有通用特性的之外,Calcite的主要功能就是基于调用规范的机制。其核心体现为执行过程中的数据处理机制。这种特性使得Calcite能够在支持多种执行引擎的环境中实现查询优化,并且这些优化操作能够自然地无缝衔接多引擎环境下的数据处理流程。

例如上图所示,在MySQL数据库中有products表,在Splunk系统中有orders表。根据惯例,orders表的scan操作按照splunk的标准流程进行。products表的scan则遵循jdbc-mysql的标准流程。join运算遵循某种逻辑规则,在此之前尚未实现其选择性机制。此外,在上图中涉及的SQL查询还包括filter运算符的功能,在该运算符下根据适配器规则将其下推至splunk系统进行处理。对于join运算而言,则存在一种可能的实现方案:使用Spark作为外部引擎将join操作转化为spark特定流程的形式。具体来说,在join转换为spark convention时,默认输入包括从jdbc-mysql和splunk系统的数据流经converters运算符进行转换。

适配器

适配器实现了calcite通过连接多种数据源来获取所需信息。该系统的组件架构如图所示。

适配器包含模型、表结构以及工厂类。
模型是对数据源物理特性的规范。
表结构即模型中对数据结构与格式的规定。
通过表接口可以访问这些数据。
Calcite通过适配层中的表接口来获取和管理这些数据。
规划者可以根据需求设定一系列优化策略,并将其整合进系统规划模块。
例如,他可设定规则将逻辑关系转换为适应特定引擎的关系表达形式。
工厂类则基于模型提取元数据信息,并自动生成相应的表结构描述。

在章节3的相关讨论中提到过

作为一种高效的抽象机制,在分布式计算架构中引入了一个强大的工具——适配器。它允许基于统一的关系型模型进行查询操作而不受单一数据处理引擎限制。Calcite系统能够将涉及多个表逻辑的关系型查询分解至各个对应的数据处理引擎,并对各子查询的结果执行聚合与关联操作。为了实现一个高效且灵活的适配器只需支持基础的数据扫描运算符即可,并可包含更多高级优化策略以提高性能效率。对于任意的关系代数表达式,在特定条件下都可以通过优化规则将其转移至适配器进行处理。

该系统已集成多种功能完善的适配组件,并非仅限于此。同时我们也具备构建新模块的能力。如图所示为Calcite内置的适配组件列表。

查询处理与优化

查询优化是calcite的一项核心功能。其实质就是在关系表达式上反复应用planner规则。这一过程依赖于cost model的支持,planner引擎旨在生成具有相同意义但计算效率更高的替代表达式。其组件均为可扩展设计,你可以引入诸如relation operators, planning rules,cost model等元素,并结合统计数据分析与算法优化以提升整体性能。

5.1 规划器规则(planner rules)

Calcite整合了一系列优化器规则来处理表达式树的转换过程。每个优化器对应一种特定模式,并负责将这种模式转换为相应的表达式树。该系统总计拥有成百上千条专门用于提升性能的优化指令。同时支持用户自定义扩展功能以增强其适应性

例如,在支持了Cassandra适配器的基础上

1) 对表的查询过滤后只会到一个分区中(因为行在一个分区中是有序的)

2) Cassandra的分区排序和要求的排序有相同的前缀

为使这两个条件得以满足,应当将其修改为cassandraFilter以下放至Cassandra实现分区filter

再比如如下更复杂的查询:

选择products表中的名称字段以及订单数量字段,
连接到sales表和products表,
并通过productId字段实现关联关系,
过滤出销售订单中存在折扣的情况,
按products表中的名称分组,
并按数量排序(降序)。

这个查询对应的关系代数表达式可以用下图中的左半部分表示:

由于WHERE子句仅作用于sales表, 我们可以将filter移动至join之前(如图所示右边部分)。该优化将显著降低运行时间. 若这两张表不在同一个backend环境中, 则这一优化使适配器能够将filter下推至backend中. 这一规则即为Calcite中的FilterIntoJoinRule.

5.2 元数据提供者

元数据承担两个主要职责:引导规划器减少查询计划的成本,并支持Rules的相关运作。该系统由一个专门承担这一职能的部分实现。
其核心功能包括:计算运算符树子表达式的全部成本;统计每条记录的数量;评估结果集大小;确定最大并行度。
此外,在某些情况下还会包含关于Plan架构的信息。

该工具实现了元数据插件接口的支持。该引擎可以选择性地覆盖providers中的现有功能模块,并可引入新定义的元数据功能模块。通常情况下,默认情况下,在多数场景中,默认情况下,默认情况下,默认情况下,默认情况下,默认情况下,默认情况下,默认情况下,默认情况下,默认情况下,默认情况

元数据提供者具有良好的替换性,并且能够通过Janino这种高效的Java轻量级编译引擎来进行实时部署与运行。这些系统采用Janino作为基础架构,并根据具体需求动态配置运行参数以适应不同的应用场景。
元数据提供者的实现模块包含了一个高效的缓存机制(Cache),该缓存机制显著提升了性能表现。

5.3 规划器引擎

规划器引擎的核心作用是通过不断触发优化规则来持续进行优化直至实现预定目标。目前calcite已提供了两类不同规格的规划器引擎,并且其中最新版本的引擎具备高度可扩展性。

该系统设计了一个基于成本计算机制的独特规划引擎。该引擎的目标是降低整体数学表达式的计算开销。通过采用递归分治策略实现类似Volcano算法的特点,在初始化阶段每个待处理的数学表达式会被预先生成一个唯一的标识符并存储其简化形式。一旦某个转换规则应用于当前状态下的数学表达式e1,则会生成一个新的等价形式e2并将其加入到与之相关的原始集合Sa中。系统将新生成的等价形式与现有的候选集Sb进行对比匹配,在发现另一个已存在的简化的版本时就会触发冲突检测机制完成合并操作。这一过程将持续至系统识别出新的独立简化形式为止或者达到预定迭代次数后终止优化流程以保证效率的同时避免无限循环的情况发生。为了提高效率系统会在达到预定迭代次数或无法进一步减少计算开销时终止优化流程以保证结果的一致性和可靠性。

该引擎属于穷举规划器家族。此引擎将不断施加规则直至生成的表达式无法再受后续规则的影响。在忽略表达式成本的情况下,该规划器展现出显著效能,并在较短时间内完成所有适用规则的应用。

用户可以根据个人需求选择相应的规划器引擎,并且可以在现有配置中更换或升级现有规划器引擎配置。另外,在不同阶段可能需要采用不同的规则集,并根据不同的优化阶段应用相应的规则集合。

总结

本文旨在详细阐述Calcite的架构体系及其核心理论基础,并较为系统地介绍了其主要组件与功能模块。鉴于此,在后续研究中仍需进一步深化和完善。

全部评论 (0)

还没有任何评论哟~