Apache Kylin 深入Cube和查询优化

前言

近几年,Apache Kylin作为一个高速的开源分布式大数据查询引擎正在迅速崛起。它充分发挥Hadoop、Spark、HBase等技术的优势,通过对超大规模数据集进行预计算,实现秒级甚至亚秒级的查询响应时间,同时提供标准SQL接口。目前,Apache Kylin已在全球范围得到了广泛应用,如百度、美团、今日头条、eBay等,支撑着单个业务上万亿规模的数据查询业务。在超高性能的背后,Cube是至关重要的核心。一个优化得当的Cube既能满足高速查询的需要,又能节省集群资源。本文将从多个方面入手,介绍如何通过优化Cube提升系统性能。

Cube基本原理

在传统多维分析就有多维立方体(OLAP Cube)的概念。Apache Kylin在大数据领域对Cube进行了扩展,通过执行 MapReduce/Spark任务构建Cube,对业务所需的维度组合和度量进行预聚合,当查询到达时直接访问预计算聚合结果,省去对大数据的扫描和运算,这就是Apache Kylin高性能查询的基本实现原理。

如图1所示,Apache Kylin会对SQL的查询计划进行改写,把源表扫描、多表连接、指标聚合等在线计算转换成对预计算结果的读取,极大减少了在线计算和I/O读写的代价。 而查询所访问的预计算结果保存在Cuboid当中(见图1红色方框),Cuboid大小只和维度列的基数有关,和源数据行数无关,这使得查询的时间复杂度可以取得一个量级的提升。
在这里插入图片描述

图1 预计算查询计划

一个Cuboid对应着一组分析的维度,并保存了度量的聚合结果。Cube就是所有Cuboid的集合,如图2所示,每个节点代表一个Cuboid。当查询到达,Apache Kylin会根据SQL所使用的维度列在Cube中选择最合适的Cuboid,最大程度地节省查询时间。
在这里插入图片描述

图2 Cube示意图

Cube优化案例

社区不乏一些使用Apache Kylin的成功案例分享,但经常还会看到很多朋友遇到性能问题,例如SQL查询过慢、Cube构建时间过长甚至失败、Cube膨胀率过高等等。究其原因,大多数问题都是由于Cube设计不当造成的。因此,合理地进行Cube优化就显得尤为重要。

这里先分享两个社区用户进行优化的案例:

案例1 – 提升Cube查询效率

背景:某智能硬件企业使用Apache Kylin作为大数据平台查询引擎,对查询性能有较高要求,希望提高查询效率。

数据:

  • 9个维度,其中1个维度基数是千万级,1个维度基数是百万级,其他维度基数是10w以内
  • 单月原始数据6亿条

优化方案:

  • 数据清理:将时间戳字段转换成日期,降低维度的基数
  • 调整聚合组:不会同时在查询中出现的维度分别包含在不同聚合组(如崩溃时间、上传时间等)
  • 设置必须维度:把某些超低基数维度设为必须维度

优化成果:

  • 查询性能:提升5倍
  • 构建时间:缩短30%
  • Cube大小:减小74%

案例二 – 提升Cube构建效率

背景:某金融企业使用Apache Kylin作为报表分析引擎,发现Cube膨胀率多大、构建时间过长,希望对这一情况进行改善。

硬件:20台高配置PC服务器

数据:事实表有100多万条记录,度量是某些列的平均值

优化方案:

  • 维度精简:去除查询中不会出现的维度
  • 调整聚合组:设置多个聚合组,每个聚合组内设置多组联合维度

优化成果:
在这里插入图片描述

Cube优化原理

从以上案例可以看出,通过Cube调优可以显著改善Apache Kylin的构建性能、查询性能及Cube膨胀率。那么这些改进的背后究竟是什么原理呢?

为了深入理解Cube,首先要先了解Cuboid生成树。如图3所示,在Cube中,所有的Cuboid组成一个树形结构,根节点是全维度的Base Cuboid,再依次逐层聚合掉每个维度生成子Cuboid,直到出现0个维度时结束。图3中绿色部分就是一条完整的Cuboid生成路径。预计算的过程实际就是按照这个流程构建所有的Cuboid。
在这里插入图片描述

图3 Cuboid生成树

通过这颗Cuboid生成树,我们不难发现:当维度数量过多,就会导致Cuboid数量以指数级膨胀;如果维度基数过大,还会使所在的Cuboid结果集变大。这些都是影响Cube膨胀率和构建时间的重要因素。

但是,所有的Cuboid都是必要的吗?实际上,在多数情况下,我们并不需要这里的每一个Cuboid,因此需要对Cuboid生成树做剪枝。剪枝可以从两个方面入手:数据特性、查询需求。首先介绍数据特性,考虑下图的两个Cuboid,左侧Cuboid包含4个维度(ABCD),右侧Cuboid包含3个维度(ABC),而两个Cuboid都包含相同(或极度相近)行数的记录,说明读取两个Cuboid结果的代价是一样的,同时左侧Cuboid除了具有右侧Cuboid的查询支持能力外,还能支持带有维度D的查询,因此右侧Cuboid就可以被去除。
在这里插入图片描述

图4 去除冗余Cuboid

再考虑查询需求,在报表或多维分析场景中,有些维度是每次查询都会出现的,如年份;有些维度总是一起出现的,如开始时间、结束时间;有些维度间是有层级关系的,如商品分类或地理信息。充分利用查询的这些实际需求也能去除不需要的Cuboid,例如:如果年份是必要的,那么所有不包含年份维度的Cuboid都可以被去除;如果两个维度总是同时出现,那么这这些维度单独出现的Cuboid就可以被去除。

在Apache Kylin中,可以通过设置Cube的维度组合规则来去除无用的Cuboid。首先,可以通过定义聚合组对维度分组,只在每个聚合组内生成Cuboid。此外,在单个聚合组内部,还可以设置维度组合规则,如:必须维度用于定义一定出现的维度、联合维度用于定义一组同时出现的维度、层级维度用于定义一组有层级关系的维度,详细的Cuboid生成规则如下图所示:
在这里插入图片描述

图5 聚合组规则

Cube优化工具

上文介绍了Cube设计和优化的基本原理,但是如何实践是一个比较有挑战的事情,需要操作者对这些原理的实现细节、数据特性、查询需求都有较深理解。所谓工欲善其事,必先利其器。这里介绍一个Cube优化的神器KyBot(https://kybot.io),可以通过可视化手段展现Apache Kylin中的各项统计指标,并进行智能化评分及规则,有助于快速定位查询、构建瓶颈和寻找解决方案。

KyBot的使用也十分简单,只需要简单上传包含日志的诊断包,后台会自动对诊断包中的查询、构建日志等历史进行分析,挖掘可能的Cube设计缺陷,通过可视化页面直观地展现出来。如果希望对日志中的敏感信息(如IP地址等)进行脱敏保护,也可以简单解决。

总结

本文着重介绍了Apache Kylin中对Cube和查询进行优化的原理、工具、方案和案例,希望能够帮助使用Apache Kylin的朋友解决工作上的棘手问题。查询需求可能随着业务发展而不断变化,而Cube优化就是不断保证Cube性能的有效手段。为了更加高效地完成调优,使用KyBot是一个最简单的方式,未来的KyBot也会更加自动化和智能化。最后,希望“麒麟神兽”在每一片大数据草原上都能施展最大的威力!

本文转载自:https://cloud.tencent.com/developer/article/1042643
原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)
原文发表时间: 2017-06-02

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值