天天看点

Apache Kylin权威指南2.4 构建Cube

<b>2.4 构建cube</b>

<b></b>

本节将快速介绍构建cube相关的操作说明和设置,因受到篇幅的限制,许多具体内容无法深入展开,读者可以从后续的第3章和第4章中获得更详细的介绍。

新创建的cube只有定义,而没有计算的数据,它的状态是“disabled”,是不会被查询引擎挑中的。要想让cube有数据,还需要对它进行构建。cube的构建方式通常有两种:全量构建和增量构建;两者的构建步骤是完全一样的,区别只在于构建时读取的数据源是全集还是子集。

cube的构建包含如下步骤,由任务引擎来调度执行。

1)创建临时的hive平表(从hive读取数据)。

2)计算各维度的不同值,并收集各cuboid的统计数据。

3)创建并保存字典。

4)保存cuboid统计信息。

5)创建htable。

6)计算cube(一轮或若干轮mapreduce)。

7)将cube的计算结果转成hfile。

8)加载hfile到hbase。

9)更新cube元数据。

10)垃圾回收。

以上步骤中,前5步是为计算cube而做的准备工作,例如遍历维度值来创建字典,对数据做统计和估算以创建htable等;第6)步是真正的cube计算,取决于所使用的cube算法,它可能是一轮mapreduce任务,也可能是n(在没有优化的情况下,n可以被视作是维度数)轮迭代的mapreduce。由于cube运算的中间结果是以sequencefile的格式存储在hdfs上的,所以为了导入到hbase中,还需要第7)步将这些结果转换成hfile(hbase文件存储格式)。第8)步通过使用hbase bulkload工具,将hfile导入进hbase集群,这一步完成之后,htable就可以查询到数据了。第9)步更新cube的数据,将此次构建的segment的状态从“new”更新为“ready”,表示已经可供查询了。最后一步,清理构建过程中生成的临时文件等垃圾,释放集群资源。

monitor页面会显示当前项目下近期的构建任务。图2-19显示了一个正在运行的cube构建的任务,当前进度为46%多。

图2-19 任务列表

单击任务右边的“”按钮,展开可以得到任务每一步的详细信息,如图2-20所示。

如果任务中的某一步是执行hadoop任务的话,那么会显示hadoop任务的链接,单击即可跳转到对应的hadoop任务监测页面,如图2-21所示。

如果任务执行中的某一步出现报错,那么任务引擎会将任务状态置为“error”并停止后续的执行,等待用户排错。在错误排除之后,用户可以单击“resume”从上次失败的地方恢复执行。或者如果需要修改cube或重新开始构建,那么用户需要单击“discard”来丢弃此次构建。

接下来将介绍几种不同的构建方式。

图2-21 mapreduce任务监测页面

2.4.1 全量构建和增量构建

1.?全量构建

对数据模型中没有指定分割时间列信息的cube,kylin会采用全量构建,即每次从hive中读取全部的数据来开始构建。通常它适用于以下两种情形。

事实表的数据不是按时间增长的。

事实表的数据比较小或更新频率很低,全量构建不会造成太大的开销。

2.?增量构建

增量构建的时候,kylin每次都会从hive中读取一个时间范围内的数据,然后进行计算,并以一个segment的形式进行保存。下次再构建的时候,会自动以上次结束的时间为起点时间,再选择新的终止时间进行构建。经过多次构建,cube中将会有多个segment依次按时间顺序进行排列,如seg-1, seg-2,…,seg-n。查询的时候,kylin会查询一个或多个segment然后再做聚合计算,以便返回正确的结果给请求者。

使用增量构建的好处是,每次只需要对新增数据进行计算,从而避免了对历史数据进行重复计算。对于数据量很大的cube,使用增量构建是非常有必要的。

图2-22是构建一个segment的cube时的输入框,需要用户选择时间范围。

图2-22 提交增量构建

在从hive读取源数据的时候,kylin会带上此时间条件,如图2-23所示。

图2-23 增量构建的sql

增量构建抽取数据的范围,采用了前包后闭的原则,即包含了开始时间,但不包含结束时间,从而保证上一个segment的结束时间与下一个segment的起始时间相同,但数据不会重复。

下一次构建的时候,起始时间必须是上一次的结束时间。如果使用kylin的web gui触发,那么起始时间会被自动填写,用户只需要选择结束时间。如果使用rest api触发,用户则需要确保时间范围不会与已有的segment有重合。

2.4.2 历史数据刷新

cube构建完成以后,如果某些历史数据发生了改动,那么需要针对相应的segment进行重新计算,这种构建称为刷新。刷新通常只针对增量构建的cube而言,因为全量构建的cube只要重新全部构建就可以得到更新;而增量更新的cube因为有多个segment,因此需要先选择要刷新的segment,然后再进行刷新。

图2-24是提交刷新的请求页面,用户需要在下拉列表中选择一个时间区间。

图2-24 刷新已有的segment

提交以后,生成的构建任务与最初的构建任务完全一样。

在刷新的同时,cube仍然可以被查询,只不过返回的是陈旧数据。当segment刷新完毕时,新的segment会立即生效,查询开始返回最新的数据。老segment则成为垃圾,等待回收。

2.4.3 合并

随着时间的迁移,cube中可能会存在较多数量的segment,使得查询性能下降,并且会给hbase集群管理带来压力。对此,需要适时地将一些segment进行合并,将若干个小segment合并成较大的segment。

合并的好处具体如下。

合并相同的key,从而减少cube的存储空间。

由于segment减少了,因此可以减少查询时的二次聚合,提高了查询性能。

htable的数量得以减少,更便于集群的管理。

下面来看看合并的操作步骤,图2-25中的cube有两个segment。

现在触发一个合并,单击actions →merge;选择要合并的起始segment和结束segment,生成一个合并的任务,如图2-26所示。

图2-26 提交合并任务

合并的时候,kylin将直接以当初各个segment构建时生成的cuboid文件作为输入内容,而不需要从hive加载原始数据。后续的步骤跟构建时基本一致。直到新的htable加载完成后,kylin才会卸载旧的htable,从而确保在整个合并过程中,cube都是可以查询的。

合并完成之后,此cube的segment减少为1个,如图2-27所示。