Apache Kylin权威指南2.4 构建Cube

    xiaoxiao2023-12-24  23

    2.4 构建Cube

    本节将快速介绍构建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所示。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)