一:为什么需要对Cube进行优化
前面说过,cube时所有维度的组合,当我们有10个维度时,那么就会计算2^10 也就是1024个cuboid,但是当我们真正查询的时候,可能只会用到100个,如果不做优化的话
1.会使得build出来的cube size 很大,从而占用大量的磁盘空间
2.cube build的时间会很长
3.会占用集群的计算资源
所以如果使用kylin做数据分析,那么cube优化将是必做的一项工作。
二 :Cube 维度优化主要方式
- CubeID 剪枝优化
- 衍生维度优化
- 聚合组优化
- 强制维度
- 层次维度
- 联合维度
- Cube并发粒度优化
上面的优化方式,都可以认为是对维度的一种剪枝,因为每种优化的最终的目的都是为了减少cubeid的数量,下面来逐个介绍每个优化项的概念以及使用场景
CubeID 剪枝优化
前面说到如果有10个维度那么就会生成2^10=1024个cubeid,如果有20个维度那么将会生成2^20=1048576个cubeid,kylin.properties中参数xxx=4096 也就是说当cubeid数量大于4096个时是无法进行创建的,会报error 为:
1.检查Cubeid数目
执行命令 :bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader xxx // xxx 为CustName
2.检查cube size
在kylin web gui 的model界面选择一个READY状态的cube,将光标移到Cube Size上面,会显示出Cube的源数据的大小,以及当前Cube的大小除以源数据大小的比例,如图:
一般,cube的膨胀率应该在0%-1000%之间,如果Cube的膨胀率超过了1000%,那么就需要查询其中的原因了,导致膨胀率高的原因一般为以下几点:
1):Cube的维度数量较多,没有进行很好的剪枝
2):Cube中存在较高基数的维度,导致这类维度每个cubeid占用的空间很大,从而造成cube体积变大
3):存在比较占用空间的度量
对于cube膨胀率高的情况下,需要针对实际的业务需求进行分析,可以考虑通过下面的几种优化方式进行优化
[Dervied Dim]衍生维度优化
衍生维度(Dervied Dim):当一个或者多个维度能够从主键中推断出来,那么这些维度列就称之为衍生“Dervied” 列
衍生维度(Dervied Dim)优化效果:维度表中的n个维度计算,将cubeid从2^n 减为2
衍生维度使用场景:
在星型模型中,有一个用户维度表,表中包含了ID,A,B,C 其中ID 为PK,在这里通过ID的值就可以确定A,B,C的值,因为A,B,C为ID的dervied。当进行build一个cube包含A,B,C 的时候,只需要包含ID,并且将A,B,C标记为derived ,这样dervied列就不会生成cubeid
[Aggregation Group]聚集组优化
聚合组(Aggregation Group): 根据业务的维度组合,划分出具有强依赖的组合,这些组合称之为聚合组,用来控制哪些CubeID用来组合计算
聚合组优化效果:如果有4个维度,分别为A,B,C,D,那么就会有16个cubeid,如果AB和CD分别为聚集组的话 那么cubeid的数量就缩减为了8个。
聚合组的使用场景:所有维度中,有部分维度之间具有聚合操作的,可以将这些维度放在一个聚合组内。不放在聚合组里面的,就直接进行base cube操作
[Mandatory Dimensions]强制维度
强制维度(Mandatory Dimensions):所有CubeID中,都包含的维度称之为强制维度,不包含强制维度的CubeID不会计算
优化效果 :只计算包含强制维度的,CubeID的数量会缩减一半。
使用场景:
假如有三个维度A,B,C。那么CubeId就会有8个,分别为ABC,AB,BC,AC,A,B,C,这时将A设置为强制维度,那么就只会计算ABC,AB,AC,A这四个CubeID
[Hierarchy Dimension]层次维度
层次维度(Hierarchy Dim):某些维度之间具有上下层次关联
优化效果 :如果有三个维度A,B,C 设置为层次维度,那么cubeid数量将由2^3减为n+1
使用场景:比较适用于进行下钻分析,比如年月日,省市县这种。
[Joint Dimension]联合维度
联合维度(Joint Dimension):固定用来分组的维度查询
优化效果:将多个维度优化到一个维度
使用场景:假如有ABC三个维度,但是在查询的时候只会出现group by A,B,C,而不会出现group A,group by B,group by A,B等等这种情况,那么就可以将A,B,C设置为联合维度
调整Cube并发粒度
当Segment中某个cuboid的大小超出一定的阀值时,系统会将该cuboid的数据分片到多个分区,从而实现cuboid数据读取的并行化,优化cube的查询速度。
kylin的默认设置中kylin.hbase.region.cut时5G,kylin.hbase.region.count.min=1,kylin.hbase.region.count.max=500
在实际应用中(根据实际数据量调整),可以将kylin.hbase.region.count.min=2,kylin.hbase.region.count.max=100,kylin.hbase.region.cut=1
上面设置为最小为2个分区,每个分区大小为1G,最多设置100个region分区
参考资料 :
http://kylin.apache.org/blog/2016/02/18/new-aggregation-group/
http://kylin.apache.org/docs/howto/howto_optimize_cubes.html
Apache Kylin 权威指南