文档章节

深入 Apache Kylin Cube 与查询优化

大数据之路
 大数据之路
发布于 2012/09/18 14:37
字数 2720
阅读 1086
收藏 0

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

1、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示意图

2、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多万条记录,度量是某些列的平均值

优化方案:

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

优化成果:

图片描述

3、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。首先,可以通过定义(1)聚合组对维度分组,只在每个聚合组内生成Cuboid。此外,在单个聚合组内部,还可以设置维度组合规则,如:(2)必须维度用于定义一定出现的维度、(3)联合维度用于定义一组同时出现的维度、(4)层级维度用于定义一组有层级关系的维度,详细的Cuboid生成规则如下图所示:

图片描述
图 - 5聚合组规则

(5)衍生维度

维表中可以由主键推导出值的列可以作为衍⽣维度。使用场景:以星型模型接入时。例如用户维表可以从userid推导出用户的姓名,年龄,性别。优化效果:维度表的N个维度组合成的cuboid个数会从2的N次方降为2。

此处输入图片的描述

(1)聚集组

聚集组:用来控制哪些cuboid需要计算。

适用场景:不是只需要计算base cuboid的情况下,都需要聚集组。

注意事项:一个维度可以出现在多个聚集组中,但是build期间只会计算一次。

如果不设置聚集组,默认情况下只会计算 base cuboid

聚集组不宜太多。

(2)强制维度

强制维度:所有cuboid必须包含的维度,不会计算不包含强制维度的cuboid。

适用场景:可以将确定在查询时一定会使用的维度设为强制维度。例如,时间维度。

优化效果:将一个维度设为强制维度,则cuboid个数直接减半。

强制维度

(3)联合维度

联合维度:将几个维度视为一个维度。

适用场景: 1 可以将确定在查询时一定会同时使用的几个维度设为一个联合维度。

2 可以将基数很小的几个维度设为一个联合维度。

3 可以将查询时很少使用的几个维度设为一个联合维度。

优化效果:将N个维度设置为联合维度,则这N个维度组合成的cuboid个数会从2的N次方减少到1。

(4)层次维度

层次维度:具有一定层次关系的维度。

使用场景:像年,月,日;国家,省份,城市这类具有层次关系的维度。

优化效果:将N个维度设置为层次维度,则这N个维度组合成的cuboid个数会从2的N次方减少到N+1。

此处输入图片的描述

(6)Extended Column

在OLAP分析场景中,经常存在对某个id进行过滤,但查询结果要展示为name的情况,比如user_id和user_name。这类问题通常有三种解决方式:

a. 将ID和Name都设置为维度,查询语句类似select name, count(*) from table where id = 1 group by id,name。这种方式的问题是会导致维度增多,导致预计算结果膨胀;

b. 将id和name都设置为维度,并且将两者设置为联合。这种方式的好处是保持维度组合数不会增加,但限制了维度的其它优化,比如ID不能再被设置为强制维度或者层次维度;

c. 将ID设置为维度,Name设置为特殊的Measure,类型为Extended Column。这种方式既能保证过滤id且查询name的需求,同时也不影响id维度的进一步优化。

所以此类需求我们推荐使用 Extended Column。

(7)HBase Rowkey顺序

简单的讲,查询频率越高的维度在Rowkey中的顺序需要越靠前。

(8)调整Cube并发粒度

当Segment中某个Cuboid的大小超出一定的阈值时,系统会将该Cuboid的数据分片到多个Hbase Region Server,从而实现Cuboid数据读取的并行化,优化Cube的查询速度。

kylin的默认设置中

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

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

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

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

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分区。

Refer:

[1] Apache Kylin 深入Cube和查询优化

http://geek.csdn.net/news/detail/199615

[2] Apache Kylin 维度优化指南

http://bit.ly/2llpR69

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

http://bit.ly/2DqB8tg

本文转载自:http://bit.ly/2llpR69

大数据之路
粉丝 1601
博文 515
码字总数 333234
作品 0
武汉
架构师
私信 提问
Kyligence正式发布KyBot - Apache Kylin在线诊断、优化及服务平台

今天, 大数据已经是每一个公司的战略,越来越多的企业正将相关的数据应用、服务等迁移到大数据平台上。作为中国唯一的Apache 软件基金会顶级开源项目,Apache Kylin在开源后的短短两年内,赢...

ApacheKylin
2016/11/17
482
0
Apache Kylin v2.5.0正式发布,开源分布式分析引擎

文章转载自开源中国,作者 Apache Kylin 社区 日前,Apache Kylin 社区宣布,Apache Kylin v2.5.0 正式发布。 Apache Kylin 是一个开源的分布式分析引擎,旨在为极大数据集提供 SQL 接口和多...

AI科技大本营
2018/10/08
0
0
Apache Kylin 2.3.0 发布,开源分布式分析引擎

Apache Kylin 2.3.0 已发布,这是继 2.2.0 之后的一个重要版本,包含超过 250 个错误修复和功能增强。点此查看升级指南。 新特性 - [KYLIN-3125] - Support SparkSql in Cube building step ...

局长
2018/03/05
1K
0
Apache Kylin和Superset(Caravel)集成

本文转自Apache Kylin公众号apachekylin. Superset 是一个数据探索和可视化平台,设计用来提供直观的,可视化的,交互式的分析体验。 Superset 提供了两种分析数据源的方式: 1. 用户可以以单...

hblt-j
2018/07/09
266
5
一文读懂Apache Kylin

“麒麟出没,必有祥瑞。”                               —— 中国古谚语 Kylin思维导图 前言 随着移动互联网、物联网等技术的发展,近些年人类所积累的数据...

陈小龙哈
2018/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部