概述
- 本内容以Apache Kylin v1.5为基础
1、背景和历史
略
2、Apache Kylin的使命
- Kylin的使命是超高速的大数据OLAP(Online Analytical Processing), 也就是要让大数据分析像使用数据库一样简单迅速,用户的查询请求可 以在秒内返回,交互式数据分析将以前所未有的速度释放大数据里潜藏 的知识和信息,让我们在面对未来的挑战时占得先机。
2.1、为什么要使用Kylin
- 现有的优秀的SQL on Hadoop工具使用的技术主要是”大规模并行处理(Massive Parallel Processing)“和”列式存储(Columnar Storage)“;无法改变查询时间与数据量成线性增长的现状;
2.2、Apache Kylin怎样解决关键问题
- 传统大数据查询一般是统计结果,是多条记录经过聚合函数计算后的统计值。原始的记录则不是必需的,或者访问频率和概率都极低。
- 聚合是按维度进行的,由于业务范围和分析需求是有限的,有意义的维度聚合组合也是相对有限的,一般不会随着数据的膨胀而增长。
- “预计算”:应尽量多滴预先计算聚合结果,在查询时刻应尽量使用预算的结果得出查询结果,从而避免直接扫描可能无限增长的原始记录。
3、Apache Kylin的工作原理
- Apache Kylin的工作原理本质上是MOLAP(Multidimensional Online Analytical Processing)Cube,也就是多维立方体分析。这是数据分析中相当经典的理论,在关系数据库年代就已经有了广泛的应用。
3.1、维度和度量简介
-
简单说,维度就是观察数据的角度。比如电商的销售数据,可以从时间的维度来观察,也可以从时间和地区的维度来观察。统计时可以吧维度值相同的记录聚合在一起,然后应用聚合函数做累加、平均、去重复计数等聚合计算;维度一般是一组离散的值
-
度量就是被聚合的统计值,也是聚合运算的结果,它一般是连续的值
3.2、Cube和Cuboid
-
根据维度和度量做预计算的Cube理论:给定一个数据模型,我们可以对其上的所以维度进行组合。对于N个维度来说,组合的所以可能性共有2N种。对于每一种维度的组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为Cuboid。所有维度组合的Cuboid作为一个整体,被称为Cube。简单说,一个Cube就是许多按维度聚合的物化视图的集合。
-
列举一个具体的例子。假定有一个电商的销售数据集,其中 维度包括时间(Time)、商品(Item)、地点(Location)和供应商(Supplier), 度量为销售额(GMV)。那么所有维度的组合就有24=16种(如图1-3所 示),比如一维度(1D)的组合有[Time]、[Item]、[Location]、[Supplier]4种; 二维度(2D)的组合有[Time,Item]、[Time,Location]、[Time、Supplier]、 [Item,Location]、[Item,Supplier]、[Location,Supplier]6种;三维度(3D)的 组合也有4种;最后零维度(0D)和四维度(4D)的组合各有1种,总共就有 16种组合。
-
计算Cuboid,即按维度来聚合销售额。如果用SQL语句来表达计算 Cuboid[Time,Location],那么SQL语句如下
select Time,Location,Sum(GMV) as GMV from Sales group by Time,Location; --将计算的结果保存为物化视图,所有Cuboid物化视图的总称就是 Cube
-
3.3、工作原理
- Apache Kylin的工作原理就是对数据模型做Cube预计算,并利用技术的结果加速查询,具体工作过程如下
- 指定数据模型,定义维度和度量。
- 预计算Cube,计算所有Cuboid并保存为物化视图。
- 执行查询时,读取Cuboid,运算,产生查询结果。
- Kylin的查询过程是利用预计算的结果来执行查询,因此速度会快很多
4、Apache Kylin的技术架构
- Apache Kylin系统可以分为在线查询和离线构建两部分;如下图,在线查询模块主要出于上半区,离线构建则处于下半区
-
数据源在左 侧,目前主要是Hadoop Hive,保存着待分析的用户数据。根据元数据的 定义,下方构建引擎从数据源抽取数据,并构建Cube。数据以关系表的形式输入,且必须符合星形模型(Star Schema)(更复杂的雪花模型在成文时还不被支持,可以用视图将雪花模型转化为星形模型,再使用Kylin)。 MapReduce是当前主要的构建技术。构建后的Cube保存在右侧的存储引擎中,一般选用HBase作为存储。
-
完成了离线构建之后,用户可以从上方查询系统发送SQL进行查询分析。Kylin提供了各种Rest API、JDBC/ODBC接口。无论从哪个接口进 入,SQL最终都会来到Rest服务层,再转交给查询引擎进行处理。这里需要注意的是,SQL语句是基于数据源的关系模型书写的,而不是Cube。 Kylin在设计时刻意对查询用户屏蔽了Cube的概念,分析师只需要理解简单的关系模型就可以使用Kylin,没有额外的学习门槛,传统的SQL应用也很容易迁移。查询引擎解析SQL,生成基于关系表的逻辑执行计划,然 后将其转译为基于Cube的物理执行计划,最后查询预计算生成的Cube并产生结果。整个过程不会访问原始数据源。
- 对于查询引擎下方的路由选择,在最初设计时曾考虑过将 Kylin不能执行的查询引导去Hive中继续执行,但在实践后发现Hive与 Kylin的速度差异过大,导致用户无法对查询的速度有一致的期望,很可 能大多数查询几秒内就返回结果了,而有些查询则要等几分钟到几十分 钟,因此体验非常糟糕。最后这个路由功能在发行版中默认关闭,因此在 图1-4中是用虚线表示的。
-
Apache Kylin1.5版本引入了“可扩展架构”的概念。在图1-4中显示为三个粗虚线框表示的抽象层。可扩展指Kylin可以对其主要依赖的三个模块做任意的扩展和替换;而Hive、 MapReduce、HBase只是默认实现。深度用户可以根据自己的需要做二次 开发,将其中的一个或多个替换为更适合的技术。
-
可扩展架构也带来了额外的灵活性,比如,它可以允许多个引擎同时并存
5、Apache Kylin的主要特点
- Kylin的主要特点包括支持SQL接口、支持超大数据集、秒级响应、可伸缩性、高吞吐率、BI工具集成等。
5.1、标准SQL接口
- Kylin内部以Cube技术为核心,对外却没有选用MDX(MultiDimensional expressions)作为接口。而是以标准SQL作为对外服务的主要接口。
- Apache Kylin在将来也可能会推出MDX接口。事实上已经有方法可以通过MDX转SQL的工具,让Kylin也能支持MDX。
5.2、支持超大数据集
- 在移动的应用场景下有了千亿记录秒级查询的案例
- Kylin在数据集规模上的局限性主要在于维度的个数和基数。它们一般由数据模型来决定,不会随着数据规模的增长而线性增长
5.3、亚秒级响应
- Apache Kylin拥有优异的查询响应速度,这点得益于预计算,很多复 杂的计算,比如连接、聚合,在离线的预计算过程中就已经完成,这大大降低了查询时刻所需要的计算量,提高了响应速度。
- 并不是使用Kylin就一定能获得最好的性能。针对特定的数据及查询模式, 往往需要做进一步的性能调优、配置优化等,性能调优对于充分利用好Apache Kylin至关重要。
5.4、可伸缩性和高吞吐率
- 这主要还是归功于预计算降低了查询时所需的计算总量,令Kylin可以在相同的硬件配置下承载更多的并发查询。
5.5、BI及可视化工具集成
- ODBC接口,与Tableau、Excel、Power BI等工具集成。
- JDBC接口,与Saiku、BIRT等Java工具集成。
- Rest API,与JavaScript、Web网页集成。
6、与其他开源产品比较
- 共有的技术:
- 大规模并行处理:可以通过增加机器的方式来扩容处理速度,在相同的时间里处理更多的数据。
- 列式存储:通过按列存储提高单位时间里数据的I/O吞吐率,还能跳 过不需要访问的列。
- 索引:利用索引配合查询条件,可以迅速跳过不符合条件的数据块, 仅扫描需要扫描的数据内容。
- 压缩:压缩数据然后存储,使得存储的密度更高,在有限的I/O速率下,在单位时间里读取更多的记录。
- Apache Kylin特色在于
合查询条件,可以迅速跳过不符合条件的数据块, 仅扫描需要扫描的数据内容。- 压缩:压缩数据然后存储,使得存储的密度更高,在有限的I/O速率下,在单位时间里读取更多的记录。
- Apache Kylin特色在于
- Cube预计算技术:预计算事先将数据按维度组合进行了聚合, 将结果保存为物化视图。经过聚合,物化视图的规模就只由维度的基数 来决定,而不再随着数据量的增长呈线性增长