Apache Kylin的Cube分析

在本篇博客中,我将给大家带来关于Kylin的Cube方面的分析,其中包括如何去查看Cube中Cuboid统计信息,Cube大小等,但是不涉及Cube方面的优化。如果对Cube优化比较感兴趣的话,可以去查阅我之前写的关于Cube优化的文章。

1.      Cuboid,Cube和Segment理解

什么是Cuboid?什么是Cube?什么是Segment?

我们这里简单说,不搞专业术语,不然人心惶惶的。比如你的模型有3个维度:

国家,省,市。

那么对于维度的每一种组合,比如“国家,省,市”查询的结果就是一个Cuboid,“国家,省”查询的结果是另一个Cuboid。

那么Cube就是上面所有维度组合的Cuboid的集合。

我们知道Cube的数据来源可以是Hive,那么对于一些Hive的表中的数据是不断增长的,比如每小时或每天等周期增长。Kylin应对这种场景,引入了增量构建Cube的功能,无需重复地处理之前已经处理过的历史数据,提升Cube的构建速度。

到这里,这样我就可以顺理成章地抛出Segment的概念,即一个Segment就是使用指定起始和结束时间的数据来源构建Cube,即代表一段时间内源数据的预计算结果。我们不难推断出一个Cube被划分为多个Segment。一个Segment的起始时间等于它之前那个Segment的结束时间,同理,它的结束时间等于它后面Segment的起始时间。每个Segment除了数据源时间范围不同,其他结构定义,构建过程,优化方法,存储方式等一样。

2.      Cuboid分析

Apache Kylin提供了一个工具,用来检查Cube中Cuboid的详细信息。下面我们将具体分析如何使用此工具,以及分析产生的结果。

当我们Cube构建成功后,就可以执行如下命令:

bin/kylin.shorg.apache.kylin.engine.mr.common.CubeStatsReader test_cube

备注:test_cube为Cube的名称

产生的结果如下:

============================================================================

Statistics of test_cube[19700101000000_20170101000000]

Cube statistics hll precision: 14

Total cuboids: 3

Total estimated rows: 180

Total estimated size(MB):0.0013949871063232422

Sampling percentage:  100

Mapper overlap ratio: 1.45

Mapper number: 0

Length of dimensionIDC_INFRASTRUCTURE_DB.HDFS_META.USERNAME is 1

Length of dimension IDC_INFRASTRUCTURE_DB.HDFS_META.GROUPNAMEis 1

|---- Cuboid 11, est row: 91, est MB: 0

   |---- Cuboid 01, est row: 43, est MB: 0, shrink: 47.25%

   |---- Cuboid 10, est row: 46, est MB: 0, shrink: 50.55%

----------------------------------------------------------------------------

============================================================================

Statistics of test_cube[20170101000000_20170501000000]

Cube statistics hll precision: 14

Total cuboids: 3

Total estimated rows: 211

Total estimated size(MB): 0.0016336441040039062

Sampling percentage:  100

Mapper overlap ratio: 1.4218009478672986

Mapper number: 0

Length of dimensionIDC_INFRASTRUCTURE_DB.HDFS_META.USERNAME is 1

Length of dimensionIDC_INFRASTRUCTURE_DB.HDFS_META.GROUPNAME is 1

|---- Cuboid 11, est row: 100, est MB: 0

   |---- Cuboid 01, est row: 55, est MB: 0, shrink: 55%

   |---- Cuboid 10, est row: 56, est MB: 0, shrink: 56%

----------------------------------------------------------------------------

============================================================================

Statistics of test_cube[20170501000000_20170801000000]

Cube statistics hll precision: 14

Total cuboids: 3

Total estimated rows: 305

Total estimated size(MB):0.0023670196533203125

Sampling percentage:  100

Mapper overlap ratio: 2.455737704918033

Mapper number: 0

Length of dimensionIDC_INFRASTRUCTURE_DB.HDFS_META.USERNAME is 1

Length of dimensionIDC_INFRASTRUCTURE_DB.HDFS_META.GROUPNAME is 1

|---- Cuboid 11, est row: 168, est MB: 0

   |---- Cuboid 01, est row: 67, est MB: 0, shrink: 39.88%

   |---- Cuboid 10, est row: 70, est MB: 0, shrink: 41.67%

----------------------------------------------------------------------------

可以看到这个Cube有三个Segment,包括每个Segment的分析结果:

test_cube[19700101000000_20170101000000]

test_cube[20170101000000_20170501000000]

test_cube[20170501000000_20170801000000]

我们只需分析其中一个Segment的内容即可,其他相似。

============================================================================

Statistics of test_cube[19700101000000_20170101000000]

Cube statistics hll precision: 14

Total cuboids: 3

Total estimated rows: 180

Total estimated size(MB):0.0013949871063232422

Sampling percentage:  100

Mapper overlap ratio: 1.45

Mapper number: 0

Length of dimensionIDC_INFRASTRUCTURE_DB.HDFS_META.USERNAME is 1

Length of dimension IDC_INFRASTRUCTURE_DB.HDFS_META.GROUPNAMEis 1

|---- Cuboid 11, est row: 91, est MB: 0

   |---- Cuboid 01, est row: 43, est MB: 0, shrink: 47.25%

   |---- Cuboid 10, est row: 46, est MB: 0, shrink: 50.55%

----------------------------------------------------------------------------

我们从上到下进行分析:

(1)    首先看到Segment整体信息,Cube statistics hll precision指对Cube估计的大小精度,以及Cube中包含的Cuboid数量,对于此Cube中的Segment包含的总行数估计和Segment大小的估计值。这里需要说明的是,Segment预估的大小会影响构建Cube中的步骤,比如常见的mapper和reducer数量,数据split大小等。

(2)    接着可以看到所有Cuboid的详细信息,其结果以树结构的方式罗列出来。每个节点代表一个Cuboid,每个Cuboid都是由一连串的0或1的数字组成,数字串的长度等于有效维度的数量,从左到右的每个数字依次代表Rowkeys设置中的各个维度。如果数字为0,则代表这个Cuboid中不存在相应的维度;如果数字为1,则代表这个Cuboid中存在相应的维度。我们也可以看到,除了最顶端的Cuboid之外,每个Cuboid都有一个父Cuboid,且都比父Cuboid少了一个“1”,也就是比父Cuboid少一个维度。

(3)    最顶端的父Cuboid为Base Cuboid,它直接由源数据计算而来,包含所有的维度。

(4)    对于每层的Cuboid还有其他的统计信息,包括Cuboid行数的估计值,该Cuboid大小的估计值,以及此Cuboid的行数与父Cuboid的对比值(即Shrink值)。

3.      检查Cube大小

在Kylin的Web GUI的Model页面中,我们可以选择一个READY状态的Cube,将鼠标移到该Cube的Cube Size列时,会提示Cube的源数据大小,以及当前Cube的大小除以源数据大小的比例,称为膨胀率(Expansion Rate)。

一般来说,Cube的膨胀率应该在0% ~ 1000%之间,如果有个Cube的膨胀率超过1000%,那么Cube管理员就应该查找原因了,通常原因有以下几个方面:

l  Cube中的维度数量较多,而且没有很好的Cuboid的剪枝优化,导致Cuboid数量太多

l  Cube中存在较高基数的维度,导致包含这类维度的每一个Cuboid占用的空间都很大

l  存在比较占用空间的度量,比如Count Distinct,需要在Cuboid的每一行中都为其保存一个较大的寄存器,如果Cuboid中每一行都有数十KB,那么Cube就会很大

原因还有其他方面的,要根据具体的原因,进行Cube优化。

参考《Apache Kylin权威指南》和《基于Apache Kylin构建大数据分析平台》。

猜你喜欢

转载自blog.csdn.net/jiangshouzhuang/article/details/77926440