查看原文
其他

【技术贴】Apache Kylin优化利器KyBot:降低Cube膨胀倍数

apachekylin 2022-04-23



Cube是Kylin做预计算的核心概念,由于预计算结果需要额外的存储,不恰当的设计会导致数据的膨胀。一般来说膨胀倍数控制在10倍以内为佳,如果膨胀倍数过高,会浪费存储空间,也会消耗更多的构建时间。那么如何才能有效降低膨胀倍数呢?在KyBot最新版本中,新增了Cube调优功能,为降低Cube膨胀倍数提供了优化的方向和思路。


KyBot官方网站:http://kybot.io





KyBot介绍


KyBot 是为Apache Kylin及其商业版KAP提供在线诊断、优化及服务的平台。通过分析Kylin的日志等信息,为用户提供可视化仪表盘、系统优化、故障排查、技术支持等服务。


仪表盘


在KyBot 的Cube仪表盘中,统计了一个Kylin实例下面所有Cube的膨胀倍数,可以通过降序排列快速定位到膨胀倍数较高的Cube。为了直观体现优化的效果,在本案例中,我们以一个比较极端的,膨胀倍数高达3万多倍的Airline_before(维度多,基数大,未经优化)来探寻优化的方法。



Airline简介


本案例中的Airline数据集来自美国交通运输部,数据主要包含的是美国本土主流航空公司的飞机起降信息,Airline Cube主要是为分析计算航班准点率、平均延误时间,航班数而建立。


减少有效维度的数量


Cube中每一种维度组合的预计算结果都会保存为一个Cuboid,Cuboid数量大小随维度数量增加而呈现指数级增长。而维度之间其实是存在一定的层级、推断等关系,利用这些关系,可以有效减少实际参与计算的维度数量,这些实际参与计算的维度被称为有效维度。在Kylin的高级设置页面可以设置维度之间的关系,通过分析维度和实际业务逻辑设定mandatory/hierarchy/joint/derived等关系,可以减少有效维度数量。下面我们看看如何通过KyBot自动发现这些维度之间的关联。


首先从下图维度分析可以看出airline_before总共有18个维度,维度比较多。只设置了一个Hierarchy, 且Hierarchy【YEAR,QUARTER,MONTH,DAYOFWEEK,FLIGHTDATE】的每一个维度基数都非常小。可以取消Hierarchy,设置为Joint(一般而言,如把若干维度设置为Hierarchy,cuboid数量可以减少1/2, 若把三个维度维度变成Joint,cuboid数量可以减少3/4)。



其次,从下图可以看出UNIQUECARRIER 基数较小,且与多个维度同时出现。从业务层面考虑,航班准点率等分析都是需要出UNIQUECARRIER来区分,结合数据特征和业务逻辑可以考虑作为Mandatory维度。



最后,多个维度之间一起出现的次数较多,可以结合业务判断是否可以作为Joint。如ARRDEL15总共出现了58次和DEPDEL15一起出现了58次, 到达延误和起飞延误有一定的必然关系,因此可以作为一个Joint。



减少无用Cuboid


收缩率代表了两个Cuboid的相似度,相似度太高,说明Cuboid可以被剪枝。以airline为例,从Cuboid 收缩率统计上发现几十个Cuboid收缩率为90%以上。



结合Cuboid层级图会发现这些Cuboid和它们的父级Cuboid行数都很多,这些差异不大的Cuboid过多会导致数据冗余。例如下图中一个收缩率为100%的Cuboid, 行数为201722行,而这个Cuboid的父级Cuboid行数为198925,行数很多,却差异不大。



对比两个Cuboid, 发现他们的差异维度CANCELLED基数比较小,不需要单独作为一个有效维度,可以考虑设置为Joint且设置后排列组合空间不会有剧烈膨胀。



优化操作


设置UNIQUECARRIER为Mandatory维度。

拆分层级聚合组,设置原层级维度【YEAR,QUARTER,MONTH,DAYOFWEEK,FLIGHTDATE】为Joint。

设置【DEPDEL15, ARRDEL15,CANCELLED,DIVERTED,AIRLINEID】【ORIGINCITYNAME和ORIGINSTAE】【DESTICITYNAME,DESTSTATE】【DEPTIMEBLK,ARRTIMEBLK】为Joint。


优化结果


在设置了相应的Mandotory, 若干组Joint 维度之后,优化后的Airline_modify膨胀率降低至13.18倍,效果非常显著。



验证查询性能


去除了冗余的Cuboid之后,原先击中这个Cuboid的查询就会转而去击中它的父级Cuboid。虽然父级Cuboid行数要比原先的Cuboid多,但是不会多很多,所以几乎没有影响。

我们结合实际业务,挑选了若干个重要的并且使用频繁的查询场景,在airline_before 和airline_modify上分别执行相同的SQL语句。从下面两图对比可以看出,优化前后的查询响应时间仍旧全部分布在0-1秒之内。




总结


降低膨胀倍数的关键在于减少可聚合的维度和无用的Cuboid,在应用中不仅需要结合KyBot的分析还需要对实际业务有深刻理解,才可以有效地降低膨胀倍数。


您可能还会想看


【技术贴】KyBot快速入门指南

【技术贴】Apache Kylin优化神器KyBot:找寻查询瓶颈

【案例分享】Apache Kylin在国美在线的应用

【案例分享】大数据多维分析引擎在魅族的实践

Apache Kylin v1.6.0正式发布





点击“阅读原文”进入官网免费试用KyBot

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存