Apache Kylin优化利器KyBot:降低Cube膨胀倍数

2017年 1月 05日

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

KyBot介绍

KyBot https://kybot.io 是为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-1S之内。

总结

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

申请试用
关注我们