Apache Calcite:Hadoop 中新型大数据查询引擎

2024-04-06 19:18

本文主要是介绍Apache Calcite:Hadoop 中新型大数据查询引擎,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Apache Calcite是面向 Hadoop 新的查询引擎,它提供了标准的 SQL 语言、多种查询优化和连接各种数据源的能力,除此之外,Calcite 还提供了 OLAP 和流处理的查询引擎。正是有了这些诸多特性,Calcite 项目在 Hadoop 中越来越引入注目,并被众多项目集成。

Calcite 之前的名称叫做optiq,optiq 起初在 Hive 项目中,为 Hive 提供基于成本模型的优化,即CBO(Cost Based Optimizatio)。2014 年 5 月 optiq 独立出来,成为 Apache 社区的孵化项目,2014 年 9 月正式更名为 Calcite。Calcite 项目的创建者是Julian Hyde,他在数据平台上有非常多的工作经历,曾经是 Oracle、 Broadbase 公司 SQL 引擎的主要开发者、SQLStream 公司的创始人和主架构师、Pentaho BI 套件中 OLAP 部分的架构师和主要开发者。现在他在 Hortonworks 公司负责 Calcite 项目,其工作经历对 Calcite 项目有很大的帮助。除了 Hortonworks,该项目的代码提交者还有MapR、Salesforce 等公司,并且还在不断壮大。

Calcite 的目标是“one size fits all(一种方案适应所有需求场景)”,希望能为不同计算平台和数据源提供统一的查询引擎,并以类似传统数据库的访问方式(SQL 和高级查询优化)来访问 Hadoop 上的数据。

Apache Calcite具有以下几个技术特性

  • 支持标准SQL 语言;
  • 独立于编程语言和数据源,可以支持不同的前端和后端;
  • 支持关系代数、可定制的逻辑规划规则和基于成本模型优化的查询引擎;
  • 支持物化视图(materialized view)的管理(创建、丢弃、持久化和自动识别);
  • 基于物化视图的 Lattice 和 Tile 机制,以应用于 OLAP 分析;
  • 支持对流数据的查询。

下面对其中的一些特性更详细的介绍。

基于关系代数的查询引擎

我们知道,关系代数是关系型数据库操作的理论基础,关系代数支持并、差、笛卡尔积、投影和选择等基本运算。关系代数是 Calcite 的核心,任何一个查询都可以表示成由关系运算符组成的树。 你可以将 SQL 转换成关系代数,或者通过 Calcite 提供的 API 直接创建它。比如下面这段 SQL 查询:

SELECT deptno, count(*) AS c, sum(sal) AS s
FROM emp
GROUP BY deptno
HAVING count(*) > 10

可以表达成如下的关系表达式语法树:

LogicalFilter(condition=[>($1, 10)])LogicalAggregate(group=[{7}], C=[COUNT()], S=[SUM($5)])LogicalTableScan(table=[[scott, EMP]])

当上层编程语言,如SQL 转换为关系表达式后,就会被送到 Calcite 的逻辑规划器进行规则匹配。在这个过程中,Calcite 查询引擎会循环使用规划规则对关系表达式语法树的节点和子图进行优化。这种优化过程会以一个成本模型作为参考,每次优化都在保证语义的情况下利用规则来降低成本,成本主要以查询时间最快、资源消耗最少这些维度去度量

使用逻辑规划规则等同于数学恒等式变换,比如将一个过滤器推到内连接(inner join)输入的内部执行,当然使用这个规则的前提是过滤器不会引用内连接输入之外的数据列。图 1 就是一个将 Filter 操作下推到 Join 下面的示例,这样做的好处是减少 Join 操作记录的数量。

图 1:一个逻辑规划的规则匹配(Filter 操作下沉)

非常好的一点是 Calcite 中的查询引擎是可以定制和扩展的,你可以自定义关系运算符、规划规则、成本模型和相关的统计,从而应用到不同需求的场景。

动态的数据管理系统

Calcite 的设计目标是成为动态的数据管理系统,所以在具有很多特性的同时,它也舍弃了一些功能,比如数据存储、处理数据的算法和元数据仓库。由于舍弃了这些功能,Calcite 可以在应用和数据存储、数据处理引擎之间很好地扮演中介的角色。用 Calcite 创建数据库非常灵活,你只需要动态地添加数据即可。

同时,前面提到过,Calcite 使用了基于关系代数的查询引擎,聚焦在关系代数的语法分析和查询逻辑的规划制定上。它不受上层编程语言的限制,前端可以使用 SQL、Pig、Cascading 或者 Scalding,只要通过 Calcite 提供的 API 将它们转化成关系代数的抽象语法树即可

同时,Calcite 也不涉及物理规划层,它通过扩展适配器来连接多种后端的数据源和处理引擎,如 Spark、Splunk、HBase、Cassandra 或者 MangoDB。简单的说,这种架构就是“一种查询引擎,连接多种前端和后端”。

物化视图的应用

Calcite 的物化视图是从传统的关系型数据库系统(Oracle/DB2/Teradata/SQL server)借鉴而来,传统概念上,一个物化视图包含一个 SQL 查询和这个查询所生成的数据表

下面是在 Hive 中创建物化视图的一个例子,它按部门、性别统计出相应的员工数量和工资总额:

CREATE MATERIALIZED VIEW emp_summary AS
SELECT deptno, gender, COUNT(*) AS c, SUM(salary) AS s
FROM emp
GROUP BY deptno, gender;
;

因为物化视图本质上也是一个数据表,所以你可以直接查询它,比如下面这个例子查询男员工人数大于 20 的部门:

SELECT deptno FROM emp_summary
WHERE gender = ‘M’ AND c > 20;

更重要的是,你还可以通过物化视图的查询取代对相关数据表的查询,可参见图 2。由于物化视图一般存储在内存中,且其数据更接近于最终结果,所以查询速度会大大加快。

图 2:查询、物化视图和表的关系

比如下面这个对员工表(emp)的查询(女性的平均工资):

SELECT deptno, AVG(salary) AS average_sal
FROM emp WHERE gender = 'F'
GROUP BY deptno;

可以被 Calcite 规划器改写成对物化视图(emp_summary)的查询:

SELECT deptno, s / c AS average_sal
FROM emp_summary WHERE gender = 'F'
GROUP BY deptno;

我们可以看到,多数值的平均运算,即先累加再除法转化成了单个除法。

为了让物化视图可以被所有编程语言访问,需要将其转化为与语言无关的关系代数并将其元数据保存在 Hive 的 HCatalog 中。HCatalog 可以独立于 Hive,被其它查询引擎使用,它负责 Hadoop 元数据和表的管理。

物化视图可以进一步扩展为DIMMQ(Discardable, In-Memory, Materialized Query)。简单地说,DIMMQ 就是内存中可丢弃的物化视图,它是高级别的缓存。相对原始数据,它离查询结果更近,所占空间更小,并可以被多个应用共享,并且应用不必感知物化视图存在,查询引擎会自动匹配它。物化视图可以和异构存储结合起来,即它可以存储在 Disk、SSD 或者内存中,并根据数据的热度进行动态调整。

除了上面例子中的归纳表(员工工资、员工数量),物化视图还可以应用在其它地方,比如 b-tree 索引 (使用基础的排序投影运算)、分区表和远端快照。总之,通过使用物化视图,应用程序可以设计自己的派生数据结构,并使其被系统自动识别和使用。

在线分析处理(OLAP

为了加速在线分析处理,除了物化视图,Calcite 还引入Lattice(格子)和 Tile(瓷片)的概念。Lattice 可以看做是在星模式(star schema)数据模型下对物化视图的推荐、创建和识别的机制。这种推荐可以根据查询的频次统计,也可以基于某些分析维度的重要等级。Tile 则是 Lattice 中的一个逻辑的物化视图,它可以通过三种方法来实体化:1)在 lattice 中声明;2)通过推荐算法实现;3)在响应查询时创建。

下图是Lattice和 Tile 的一个图例,这个 OLAP 分析涉及五个维度的数据:邮政编码、州、性别、年和月。每个椭圆代表一个 Tile,黑色椭圆是实体化后物化视图,椭圆中的数字代表该物化视图对应的记录数。

图 3:Lattice 和 Tile 的示例图

由于 Calcite 可以很好地支持物化视图和星模式这些 OLAP 分析的关键特性,所以 Apache 基金会的Kylin 项目(Hadoop 上 OLAP 系统)在选用查询引擎时就直接集成了 Calcite。

支持流查询

Calcite 对其 SQL 和关系代数进行了扩展以支持流查询。Calcite 的 SQL 语言是标准 SQL 的扩展,而不是类 SQL(SQL-like),这个差别非常重要,因为:

  • 如果你懂标准 SQL,那么流的 SQL 也会非常容易学;
  • 因为在流和表上使用相同的机制,语义会很清楚;
  • 你可以写同时对流和表结合的查询语句;
  • 很多工具可以直接生成标准的 SQL。

Calcite 的流查询除了支持排序、聚合、过滤等常用操作和子查询外,也支持各种窗口操作,比如翻滚窗口(Tumbling window)、跳跃窗口(Hopping window)、滑动窗口(Sliding windows)、级联窗口(Cascading window)。其中级联窗口可以看作是滑动窗口和翻滚窗口的结合。

总结

Calcite 是一种动态数据管理系统,它具有标准 SQL、连接不同前端和后端、可定制的逻辑规划器、物化视图、多维数据分析和流查询等诸多能力,使其成为大数据领域中非常有吸引力的查询引擎,目前它已经或被规划集成到 Hadoop 的诸多项目中,比如 Lingual (Cascading 项目的 SQL 接口)、Apache Drill、Apache Hive、Apache Kylin、Apache Phoenix、Apache Samza 和 Apache Flink。

这篇关于Apache Calcite:Hadoop 中新型大数据查询引擎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880620

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密