Apache Kylin Cube优化方式

2022-04-18 14:12:37 浏览数 (1)

在Kylin高性能的背后,Cube是至关重要的核心,上篇有说到cube是所有dimession的组合,每一种dimession的组合称之为cuboid。有n个dimession的cube会有2^n个cuboid,一个优化得当的Cube既能满足高速查询的需要,又能节省集群资源,本文将会从Kylin Cube的设计方面来了解一下Cube的优化方案。

一:为什么需要对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 权威指南

0 人点赞