微信号:ApacheKylin

介绍:Apache Kylin 公众号,介绍Kylin的各种功能,特性以及相关的新闻,活动等.更多信息,请访问Kylin网站:http://kylin.io 相关技术问题,请订阅Apache Kylin邮件列表

【技术帖】Apache Kylin Cube优化方式

2017-12-27 17:58 刘彬

【文章转载自大数据技术博文】


作者简介

刘彬,中企动力Paas大数据平台工程师,目前负责Paas大数据平台设计与开发工作。




前言

Apache Kylin 在中企的使用主要在新数仓系统以及 BI 报表的数据计算工作,带来的变化有:


一方面Kylin帮助我们提升了开发效率,减少了开发人员需要手动编写HQL/SQL 语句去查询维度数据的状况;

另一方面解耦现有系统设计,数据计算层主要包括Spark类的实时计算和HQL的离线计算(Kylin在我司目前还没有接入实时流计算,后期会尝试接入),通过引入Kylin,整个离线计算这一块就可以转到Kylin去处理,灵活度高了很多;


最后,Apache Kylin采用HBase做为结果集的存储,对外提供API,并且支持大部分BI展示工具,目前2.0+版本也提供了基于Spark的计算引擎和雪花模型,可见,在未来Kylin在中企动力的应用场景会越来越丰富。



在Apache Kylin高性能的背后,Cube是至关重要的核心。Cube是所有Dimension 的组合,每一种Dimension 的组合称之为Cuboid,有N个Dimension的Cube就会有2^n个Cuboid。因此,一个优化得当的Cube既能满足高速查询的需要,又可节省集群资源,本文将从Kylin Cube的设计方面带大家了解Cube的优化方案。




为何需要优化Cube?

前面说过,Cube是所有维度的组合,当我们有10个维度时,那么就会预计算2^10 也就是1024个Cuboid,但当我们真正查询的时候,可能只会用到100个Cuboid,如果不对Cube进行优化的话:


1、会使得Build出来的Cube Size 很大,从而占用大量的磁盘空间;

2、Cube Building的时间会很长 ;

3、会占用集群的计算资源 。


因此,如果使用Apache Kylin做数据分析,Cube优化将是我们必做的一项工作。



Cube 维度优化主要方式

·       Cube ID 剪枝优化

·       衍生维度优化

·       聚合组优化

·       强制维度

·       层次维度

·       联合维度

·       Cube并发粒度优化


以上7种优化方式,都可以认为是对维度的一种剪枝,因为每种优化的最终目的都是为了减少Cuboid的数量,下面我将逐个介绍每个优化项的概念以及使用场景。


Cube ID 剪枝优化

前面说到如果有10个维度,那么就会生成2^10=1024个Cuboid,如果有20个维度那么将会生成2^20=1048576个Cuboid,是指数级增长,kylin.properties中参数      kylin.cube.aggrgroup.max-combination=4096,也就是说当Cuboid数量大于4096时,      Cube定义是无法保存的的,会报TooManyCuboidException异常。


1.检查Cuboid数目


执行命令 :

bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader cubeName



2.检查Cube Size


在kylin web gui 的model界面选择一个READY状态的Cube,将光标移到Cube Size上面,会显示出Cube源数据的大小,以及当前Cube的大小除以源数据大小的比例,如图:



一般,Cube的膨胀率应该在0%-1000%之间,如果Cube的膨胀率超过了1000%,那么就需要查询其中的原因了,导致膨胀率高的原因一般为以下几点:


1)、Cube的维度数量较多,没有进行很好的剪枝;

2)、Cube中存在较高基数的维度,导致这类维度每个Cuboid占用的空间很大,从而造成Cube体积变大;

3)、存在比较占用空间的度量。


对于Cube膨胀率高的情况,需要针对实际的业务需求进行分析,可以考虑通过下面的几种优化方式进行优化:


[Derived Dim]衍生维度优化


衍生维度(Derived Dim):当一个或者多个维度能够从主键中推断出来,那么这些维度列就称之为衍生“Derived” 列。

衍生维度(Derived Dim)优化效果:维度表中的n个维度计算,将Cuboid从2^n 减为2。


使用场景:在星型模型中,有一个用户维度表,表中包含了ID,A,B,C ,其中ID 为PK,在这里通过ID的值就可以确定A,B,C的值,因为A,B,C为ID的Derived。当进行build一个Cube包含A,B,C 的时候,只需要包含ID,并且将A,B,C标记为derived ,这样derived列就不会生成Cuboid 。



[Aggregation Group]聚合组优化 


聚合组(Aggregation Group): 根据业务的维度组合,划分出具有强依赖的组合,这些组合称之为聚合组,在聚合组内,维度之间的组合会预计算,聚合组之间并不交叉预计算,从而减少Cuboid的数量.

聚合组优化效果:如果有4个维度,分别为A,B,C,D,那么就会有16个Cuboid,如果AB和CD分别为聚集组的话,那么Cuboid的数量就缩减为8个。


使用场景:所有维度中,有部分维度之间具有聚合操作的,可以将这些维度放在一个聚合组内。不放在聚合组里面的,就直接进行Base Cube操作。




[Mandatory Dimensions]强制维度


强制维度(Mandatory Dimensions):所有Cubeid中都包含的维度称之为强制维度,不包含强制维度的Cubeid不会计算。


优化效果:只计算包含强制维度的Cubeid,Cubeid的数量会缩减一半。


使用场景:假如有三个维度A,B,C,那么Cuboid就会有8个,分别为ABC,AB,BC,AC,A,B,C,这时将A设置为强制维度,那么就只会计算ABC,AB,AC,A这四个 Cubeid。



[Hierarchy Dimension]层次维度


层次维度(Hierarchy Dim):某些维度之间具有上下层次关联。


优化效果 :如果有三个维度A,B,C 设置为层次维度,那么Cuboid数量将由2^3减为3+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的数据分片到多个Hbase Region Server,从而实现Cuboid数据读取的并行化,优化Cube的查询速度。


kylin的默认设置中

kylin.storage.hbase.region-cut-gb=5,

kylin.storage.hbase.min-region-count=1,

kylin.storage.hbase.max-region-count=500 

在实际应用中(根据实际数据量调整),可以将

kylin.storage.hbase.min-region-count=2,

kylin.storage.hbase.max-region-count=100,

kylin.storage.hbase.region-cut-gb=1


上面设置为最小为2个分区,每个分区大小为1G,最多设置100个region分区。




参考资料 

[1].<New Aggregation Group>(http://kylin.apache.org/blog/2016/02/18/new-aggregation-group/)

[2].<Optimize Cubes>(http://kylin.apache.org/docs/howto/howto_optimize_cubes.html)

[3]《Apache Kylin 权威指南》(京东、当当等均有售)


更多信息请点击阅读原文

 "Apache and Apache Kylin are either registered trademarks or trademarks of The Apache Software Foundation in the US and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks."


您可能还会想看



顶级项目孵化的故事系列——Kylin的心路历程

开源访谈 | 2.0 划时代版本后的 Apache Kylin ,前路何方?

【干货】AWS上Apache Kylin调度系统的设计

Kyligence Robot V1.5发布说明

使用Kyligence Robot诊断Apache Kylin系统故障

【技术帖】使用KyBot优化Apache Kylin存储

Apache Kylin v2.1.0正式发布

 
apachekylin 更多文章 Apache Kylin查询性能优化 使用Kyligence Robot诊断Apache Kylin系统故障 Kyligence Robot V1.5发布说明 【干货】AWS上Apache Kylin调度系统的设计 Apache Kylin v2.2.0正式发布
猜您喜欢 阿里云.NoSQL表格存储(by 十品) 软件的现在与未来 我们来聊聊技术债务 霸气写出HelloWorld代码,现在终于可以在手机上体验啪啪啪了