在本篇博客中,我将给大家带来关于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构建大数据分析平台》。