3.3 Kylin中的核心部分:Cube构建

在上面介绍的Kylin体系架构中,我们也提到了Kylin的核心部分为Cube的构建引擎,本节将详细揭秘Kylin中Cube的各方面。我们先从理论上说明每个Cube是如何计算出来的,后面环境搭建起来会进行实践。

Kylin在1.5之前的版本中,对于Cube的构建,Kylin提供了一个称作Layer Cubing的算法。简单来说,就是按照dimension数量从大到小的顺序,从Base Cuboid开始,依次基于上一层Cuboid的结果进行再聚合。每一层的计算都是一个单独的MapReduce任务,如图3-3所示。

图3-3

Layer Cubing算法,可以称为逐层算法,它会启动N+1轮MapReduce计算。第一轮读取原始数据(RawData),去掉不相关的列,只保留相关的。同时对维度列进行压缩编码,以此处的四维Cube为例,经过第一轮计算出ABCD组合,我们也称为Base Cuboid。

此后的每一轮MapReduce,输入是上一轮的输出,以重用之前计算的结果,去掉要聚合的维度,算出新的Cuboid,以此往上,直到最后算出所有的Cuboid。

从1.5.x开始引入了Fast(in-mem)cubing算法,利用Mapper端计算先完成大部分聚合,再将聚合后的结果交给Reducer,从而降低对网络瓶颈的压力。对500多个Cube任务的实验显示,引入Fast cubing后,总体的Cube构建任务提速1.5倍,如图3-4所示。

图3-4

MapReduce的计算结果最终保存到HBase中,HBase中每行记录的Rowkey由dimension组成,measure会保存在column family中。为了减小存储代价,这里会对dimension和measure进行编码。