Kylin

作者: 奉先 | 来源:发表于2018-07-23 10:47 被阅读34次

作者:Apache Kylin核心团队
读书日期: 2018-07-23 ~ 2018-07-30
ISBN:978-7-111-55701-2

2. 快速入门

2.1 术语

BI(Business Intelligence):即商务智能,指用现代数据仓库技术、在线分析技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。
OLAP(Online Analysis Process): 联机分析处理,能够弹性的提供上卷(Roll-up)、下钻(Drill-down)和透视分析(Pivot)等操作,它是呈现集成性决策信息的方法,多用于决策支持系统、商务智能或数据仓库。
维度和度量:在统计报表中通常意义上的维度和指标,也可以称为数据的属性和度量值。
Cube:也就是数据立方体,可以对原始数据建立多维度索引,使用Cube对数据进行分析可以极大提高效率。
Cuboid:是Kylin在某一维度组合下所计算的数据。
如果一个Cube有n个维度,那么该Cube会有2的n次方个Cuboid。
Cube Segment:是针对源数据中的某一个片段,一般按照时间顺序来构建。

2.2 准备数据

Kylin选择Hive作为数据的主要来源,在使用Kylin前,先把待分析数据放到Hive里。

在hive中进行表设计时,有几种不同的模型类型,包括星型模型,雪花模型,事实星座模型。
星型模型是一个事实表搭配多个维度表。
雪花模型在星型模型的基础上,每个维度再分一些层级(不准确的讲,维度表有了自己的维度表)。
事实星座模型更为复杂,其中包含多个事实表,而维度表是共用的。
Kylin只支持星型模型的数据集。

Kylin对维度表的要求:
1.数据一致性,主键必须是唯一的(Kylin会进行检查,如有重复会报错)。
2.维度表尽量小,阈值是300M。
3.改变频率低,维度表尽量少改动。
4.维度表最好不要是Hive视图。因为Kylin会将维度表视图物化为实体表,从而增加额外开销。

Kylin在构建增量Cube时,一般增量地从Hive抽取数据。一般地,如果这个列对应Hive的分区字段(例如以时间分区),这样的列在Kylin中称为分割时间列(Partition Time Column)

维度的基数(Cardinality)是指该维度在数据集中出现的不同的值的个数。维度的基数越大,相应的Cube也会更复杂,可以通过count distinct提前了解不同维度的维度基数。

2.3 设计Cube

2.3.1 导入Hive表定义

这个步骤中,Kylin读入Hive表的表定义(事实表和维度表)。选择“Data Source” Tab页,点击“Load Hive Table”图标。


导入Hive表定义

下面输入要导入的Hive表表名(库.表名),可以输入以逗号分隔的多个表。点击“Sync”按钮后就后加入这些表。

2.3.2 创建数据模型

数据模型是Cube的基础,用来描述一个星型模型。在"Models" tab页中,点击"New" -> "New Model" , 输入Model的名称后,选择一个事实表(必须),和维度表(可选)(Add Lookup Table),并建立关联关系。然后,选择维度列(可以来自事实表或者维度表)。然后选择度量列(必须来自事实表)。最后一步,是为模型补充分割时间列信息和过滤条件。

2.3.3 创建Cube

1.选择一个model,为这个Cube命名。
2.选择维度。Kylin往往采用事实表外键代替维度表主键来计算和存储,维度可以是普通维度或者衍生维度(根据现有维度列计算而来)。
3.创建度量。Kylin默认会创建一个Count(1)的度量。Kylin可以支持在一个Cube中添加多达上百个的度量。命名度量->选择一种计算方式(SUM,COUNT,) -> 选择数据模型中的列。

创建度量
4.关于Cube数据刷新的设置,包括自动merge阈值、保留时间等。
5.高级设置:
这里边主要设置聚合组和rowkey。
(1) 聚合组主要在维度较多时候(大于等于10个)时,发挥较大的作用。假如一个Cube有(m+n)个维度,那么默认地,会有2(m+n)个Cuboid,但是我们如果分成2个聚合组(一个组有m个维度,一个组有n个维度),那么就会有2m + 2^n 个Cuboid,大大减少了计算量。这也告诉我们,不同聚合组的维度将不会再组合计算
在聚合组中,包含3个优化选项,包括Mandatory、Hierarchy、Joint维度。Mandatory维度是一定会出现在Where条件中的维度,这样Cuboid中会必须包含这个维度,减少Cuboid的量;Hierarchy是包含层级关系的维度;Joint是组合维度(总是会一起查询,并且基数很低)。
Cube的值以key-value的形式存储在HBase中,其中,key值就是维度的组合值。在存储时,key值可以选择合适的编码方式,包括字典编码(dictionary)、整数编码、固定长度编码。前两种性能会好些,字典编码是将String映射为Int存储,这种比较适合于维度是非固定长度String,并且基数不大。整数编码适合整型的维度。非固定编码效率较低,是种权宜之计。
  1. 为kylin配置全局参数。

2.3.4 构建Cube

下面需要构建创建好的Cube。点击Cube的Action -> Build ,可以在Monitor页面查看Cube的构建进度。
Cube在构建时候,会经过很多个不同的步骤,包括以下一些:
1)创建临时的Hive平表(从Hive读取数据)。
2)计算各维度的不同值,并收集各Cuboid的统计数据。
3)创建并保存字典。
4)保存Cuboid统计信息。
5)创建HTable。
6)计算Cube(一轮或若干轮MapReduce)。
7)将Cube的计算结果转成HFile。
8)加载HFile到HBase。
9)更新Cube元数据。
10)垃圾回收。

构建Cube有两种方法:全量构建 (数据量小,无时间分割字段) 、 增量构建(数据量大,存在时间分割字段)。
增量构建抽取数据的范围,采用了前包后闭的原则,即包含了开始时间,但不包含结束时间,从而保证上一个Segment的结束时间与下一个Segment的起始时间相同,但数据不会重复。

历史数据刷新:选择Action->Refresh 可以选择历史的一个Segment来刷新。

合并操作:单击Actions→Merge;选择要合并的起始Segment和结束Segment,生成一个合并的任务。

6. Cube优化

Cube优化主要涉及的议题就是Cuboid的剪枝操作,说白了,就是尽量减少Cuboid的数量,这样Kylin只需要存储较少的内容,并且在查询时,也可以筛选较少的内容了。

6.1 Cuboid的剪枝优化

对于一个已经构建好的Cube,如何查看这个Cube已经预计算了哪些Cuboid,并且他们每个占用的空间和记录数呢。 Kylin提供了一个工具(命令行工具)。

bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader CUBE_NAME

其中参数CUBE_NAME是需要查看的Cube的名称。

6.2 Cuboid剪枝优化的工具

一般地,Cuboid的剪枝优化常用两种方式。一种是衍生维度,一种是聚合组。
衍生维度在创建Cube的时候指定。我们知道,Cuboid的数量由Cube中维度的数量决定,从这个角度看维度越少越好。但是,如果维度很少,我们在构建完Cube后,查询时又很麻烦,因为如果构建Cube时未选择某个维度,那么就不能按照这个维度来筛选数据。这时候,衍生维度就派上用场了,简单地说,衍生维度在增加时不会增加整个Cube的Cuboid数量,但是又能保证我们在构建完Cube后,能够按照衍生维度来筛选查询。Kylin内部保存维度表主键和衍生维度的映射关系。非常OMG的功能。

聚合组是另一种更强大的剪枝工具,简单理解聚合组的功能,减少维度数量,不同聚合组间的维度不能够再进行排列组合运算了。我在上文有举例。同一个组内的维度更可能同时被同一个查询用到,因此会表现出更加紧密的内在关联。不同的分组有可能会贡献出相同的Cuboid,构建引擎会察觉到这点,并且保证每一个Cuboid无论在多少个分组中出现,它都只会被物化一次。

相关文章

网友评论

      本文标题:Kylin

      本文链接:https://www.haomeiwen.com/subject/ltvdmftx.html