Apache Kylin 介绍 中篇

569 阅读7分钟

提要

在Apache kylin上篇中我们介绍了kylin学习之前的理论知识,kylin的诞生,和kylin所要立足解决的问题,以及kylin提供高效交互式查询。在下篇我们将着重介绍kylin的原理、架构。希望你能有所收获。注意本文档中很多使用《Apache Kylin权威指南(第2版)》中的例子,其中也加入我的一些阅读所感与思考,和对部分知识进行重新归类以及知识点的补充。推荐读者阅读原书。

原理

Apache Kylin的工作原理本质上是MOLAP(Multidimensional Online Analytical Processing)Cube 多维立方体分析。有点抽象,不要急咱们慢慢理解。

维度和度量

在说明上面说的的多位立方体分析(MOLAP cube)之前,我们先了来介绍维度(dimension)和度量(measure)这两个概念。

维度(dimension)

简单来讲,维度(dimension)就是观察数据的角度。比如电商的销售数据,可以从时间的维度来观察。维度一般是一组离散数据,如我们在上篇所说,时间、颜色集合等。非是即否,要么存于集合之中,要么存在集合之外。

度量(measure)

度量(measure)则是统计时可以把维度值相同的记录聚合起来,应用聚合函数做累加、平均、去重复计数等聚合计算后的统计值,也就是聚合运算的结果。

维度和度量

Cube和Cuboid

了解了维度和度量,就可以对数据表或者数据模型上的所有字段进行分类了,它们要么是维度,要么是度量(可以被聚合)。于是就有了根据维度、度量做预计算的Cube理论。

数据表

什么数据表呢?如存在关系型数据库中数据集合,也就是表。他们都是拥有固定的格式。如下表

序列号(账号)类型(账号)地区(账号)联系方式(账号)
10001卖家合肥137xxxxx11
10002买家阜阳137xxxxx12
10003买家芜湖137xxxxx13
10004买家滁州137xxxxx14

数据模型

实际开发中,我们很少将所有数据存储在一张表,而是将数据进行拆分,如我们有区域表,类型表,时间表等。我们通过外键方式进行关联。如下表

序列号(账号)序列号(账号类型)序列号(区域类型)联系方式(账号)
1000111001137xxxxx11
1000221002137xxxxx12
1000321003137xxxxx13
1000421004137xxxxx14
序列号(账号类型)名称(账号类型名称)
1买家
2卖家
......
序列号(区域类型)名称(区域名称)
1001合肥
1002阜阳
1003芜湖
1004滁州
......

可以通过下面的sql达到一张表的效果,但是实际存储则是分为3张表,达到数据切分的作用。

select * from 账号,账号类型,区域类型 where 类型(账号) = 序列号(账号类型) and 类型(账号)= 序列号(区域类型)

数据模型,可以理解成多张数据表的集合。我们将数据表按功能拆分,可以将数据表分为事实表和维度表两种。

事实表

事实表(Fact Table)是指存储事实记录的表,如系统日志、销售记录等,并且是维度模型中的主表,代表着键和度量的集合。事实表的记录会不断地动态增长,所以它的体积通常远大于其他表,通常事实表占据数据仓库中90%或更多的空间。如上例中账号表就是事实表。

维度表

维度表(Dimension Table),也称维表或查找表(Lookup Table),是与事实表相对应的一种表。 它是事实表中的键引用的查找表。它保存了维度的属性值,可以与事实表做关联,相当于将事实表上经常出现的属性抽取、规范出来用一张表进行管理,常见的维度表有:日期表(存储日期对应的周、月、季度等属性)、地点表(包含国家、省/州、城市等属性)等。

注意,除了减少一张数据表的大小以外,还有其他优点。

● 便于维度的管理和维护,增加、删除和修改维度的属性时,不必对事实表的大量记录进行改动。

● 维度表可以为多个事实表同时使用,减少重复工作。

数据模型,我们将数据表按功能拆分,可以将数据表分为事实表和维度表两种。如果我们按数据模型组成结构进行区分,可以将数据模型分成有如星形模型(Star Schema)、雪花模型(Snowflake Schema)、事实星座模型(Fact Constellation)等。

星形模型(Star Schema)

星型模型是一种多维的数据关系,它由一个事实表(Fact Table)和一组维表(Dimension Table)组成,每一个维度都直接与事实表相连接。从结构上看就像很多星星围绕在一个恒星周围,故名为星形模型。

星型模型

雪花模型(Snowflake Schema)

雪花模型,当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,其图解像多个雪花连接在一起,故称雪花模型。

雪花模型

事实星座模型(Fact Constellation)

事实星座模型是更为复杂的模型,其中包含多个事实表,而维度表是公用的,可以共享。可以理解就是多个星型模型和雪花模型揉在一起。

Cube理论

给定一个数据表或者数据模型,我们可以对其上所有维度进行组合。对于N个维度来说,所有组合的可能性有2N种。 为啥是2N种可以查看上篇中组合总数的概念及公式。对每一种维度的组合,将度量做聚合运算,运算的结果保存为一个物化视图[可以理解成就是存储下来],称为Cuboid。将所有维度组合的Cuboid作为一个整体,被称为Cube。所以简单来说,一个Cube就是许多按维度聚合的物化视图的集合。

举一个具体的例子。假定有一个电商的销售数据集,其中维度有时间(Time)、商品(Item)、地点(Location)和供应商(Supplier),度量有销售额(GMV)。那么,所有维度的组合就有2^4=16种如下图

cube

0D(零维度)[]

1D(一维度)[time][Item][Location][Supplier]

2D(二维度)[Time,Item][Time,Location][Time、Supplier][Item,Location][Item,Supplier][Location,Supplier]

3D(三维度)[Time,Item,Location][Time,Item,Supplier][Time、Location、Supplier][Item,Location、Supplier]

4D(四维度)[time、Item、Location、Supplier]

一维度(1D)的组合四种,二维度(2D)的组合有六种,三维度(3D)的组合也有四种,最后,零维度(0D)和四维度(4D)的组合各有一种,共计16种组合。

架构

Apache Kylin系统可以分为在线查询和离线构建两部分。在线查询主要由上半区组成,离线构建在下半区。如图

Apache Kylin架构

离线构建

先看离线构建的部分。如图,数据源在左侧,目前主要是Hadoop、Hive、Kafka和RDBMS,其中保存着待分析的用户数据。构建中我们可以选择使用MapReduce或Spark进行构建,构建后的数据保存在右侧,目前Hbase是默认的存储引擎。

注意:用户数据以关系表的形式输入,且必须符合星形模型(Star Schema)或雪花模型(Snowflake Schema)

在线查询

在线查询部分。用户可以从上方查询系统发送SQL来进行查询分析。Kylin提供了多样的REST API、JDBC/ODBC接口。

架构迭代

为Kylin技术的与时俱进,Apache Kylin v1.5版本引入了“可扩展架构”的概念。Apache Kylin将数据源、构建引擎、存储引擎三大主要依赖模块抽象为接口,而Hive、MapReduce、HBase只是默认实现。其他实现还有:数据源还可以是Kafka、Hadoop或RDBMS;构建引擎还可以是Spark、Flink。资深用户可以根据自己的需要做二次开发。

Apache Kylin架构

参考文献&学习资源

书籍 :Apache Kylin权威指南(第2版)

知乎 :星型模型与雪花模型

官网 :架构