未名企鹅极客 | Kylin Cube构建优化(上)

Kylin Cube构建优化

联机分析处理OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到在这里插入图片描述
深入理解数据的目的。

多维数据组织OLAP的使用一般有两种背景条件:
Ø 查询需求一般是统计结果,为数据经过聚合函数计算得到的统计值,并非直接面向原始数据,访问原始记录的频率也不那么高。
Ø 聚合是按照维度进行的,一般业务需求可控,维度聚合有限,不会随着数据膨胀而迅速增长。

在这里插入图片描述

Apache Kylin介绍
Apache Kylin(以下简称Kylin)是一个开源的、分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据。

Kylin除了传统大数据分析的大规模并行处理和列式存储之外,还对数据进行了预计算处理,从而大幅减少了在 Hadoop/Spark上百亿规模数据查询延迟,达到秒级甚至亚秒级响应。

在这里插入图片描述

Kylin大致处理分三步,如下:

1定义数据集上的一个星形或雪花形模型
2在定义的数据表上构建Cube
3使用标准 SQL 通过 ODBC、JDBC 或 RESTFUL API 进行查询

此文主要叙述第2步、第3步中涉及的Cube构建、查询性能优化等内容。

1.Cube优化项概述
当模型(Model)建立好后,Cube的构建与生成将是最耗时的部分,可对此部分进行优化。

理论上我们知道,N个维度将会产生2^n个排列组合,因此,可对Cube进行剪枝降维等操作降低其复杂度,从而改善Cube的生成时间和查询响应。

1.1 Hierarchies
利用层级维度降低组合复杂度,比如当省、市、区不设置为hierarchy dimension时,理论的组合数目有2^3个,
group by province
group by province, city
group by province, city, district
可见,经过hierarchy设定,由2^3降至3个组合。

在这里插入图片描述

1.2 Mandatory
当查询中都存在GROUP BY某些维度,则可以把这些维度配置为必要维度。

Mandatory Dimensions是在每次查询都会用到的维度,比如下图中A如果为Mandatory dimension,则与B、C总共构成了4个cuboid,相较于之前的cuboid(2的3次方,8)减少了一半。

在这里插入图片描述

1.3 Rowkeys
Kylin中的RowKey由shard id + cuboid id + dimension values三部分组成,其中shard id有两个字节,cuboid有八个字节,dimension values为各个维度值经过编码后的值。

dict:
默认dict编码字段基数只有5000000,dict字典适用中低基维度,如地区信息,国家、省份、城市等。

fixed_length:
固定长度N存储维度值,超过长度部分会截断,fixed_length适用高基维场景,如电话号码,IP等。

1.4 Shard By
Rowkeys最多可为一个维度配置Shard By值为true。

Cube在构建过程中需要将中间表的数据分布到HDFS节点,默认partition方式是随机。如果指定分片维度,则使用分片维度做partition。partition的目的是防止中间表大小差异造成数据倾斜,因此Shard By维度应该使用高基维度,以使分片粒度足够小,能够加速计算任务。

1.5 Advanced Dictionaries
Global Dictionary
通常用以支持任意粒度的聚合,精确去重(count_distinct)需保存明细数据,使用Bitmap保存精确去重度量数据。Kylin所用RoaringBitmap仅支持Int类型的数据,所以引入了全局字典,以保证在不同Segment上,String到Int的映射一致。

1.6 Derived Columns
当一个或多个维度能够从另一个维度(一般为事实表的外键)推导出来,可以考虑将这个列设置为派生列。派生列不会参与Cube计算。

假设我们有一个lookup table,将事实表连接起来,条件为“where DimA=DimX”。请注意,在Kylin中,如果选择了FK维度,则相应的PK字段将自动被查询,而不会产生任何额外的花销。

Fact table
(joins)
Lookup Table
column1,column2, DimA(FK)

DimX(PK),DimB, DimC

1.7 Aggregations group
根据关注的维度组合,划分出组合大类,在 Apache Kylin 里面被称为聚合组。例如下图中展示的 Cube,如果用户仅仅关注维度 AB 组合和维度 CD 组合,那么该 Cube 则可以被分化成两个聚合组,分别是聚合组 AB 和聚合组 CD。如图 所示,生成的 Cuboid 数目从 16 个缩减成了 8 个。

2.优化方法
2.1 减少组合
通过构建cube时对维度在joint、Hierarchy参数上的配置减少cuboid的组合数量。
joint参数配置:把所有的id(主键)与对应的信息进行组合。
Hierarchies参数配置:把可以级联查询的维度可能放在里面。

经过削减组合的cuboid物化视图类似如下:
图片2.2 对输出进行压缩配置
压缩算法:snappy or gzip,可节省大量存储空间

2.3 构建过程与时间分配
了解每个过程与大致的时间分配会使后续的优化手段更具效果,通常构建cube的时间分配如下:

2.4 通过设置聚合组(Aggregations group)来提高查询时的命中率
设置一个聚合组和设置3个聚合组的情况对比:3个聚合组相对1个聚合组在构建cube时花费的时间多了3%,存储容量多了0.6%,但是查询性能要更好。

2.5 通过参数设置优化构建时间与查询响应
Hbase的分区数:kylin.storge.hbase.min-region.count
将该参数数量适当提升后,可大幅提高复杂查询的响应时间
yarn.nodemanager.resource.memorg-mb=15 GB
yarn.nodemanager.resource.cpu-vcores=8 cores
由mr引擎构建的cube,适当设置该参数可缩短构建时间

欢迎CIO交流
关于Kylin Cube构建优化还有很多手段和技巧,如果您有经验想要分享,欢迎关注未名企鹅公众号,订阅极客栏目,或者点击文末左下角“阅读原文”给我们留言提出您的需求建议。

关于未名企鹅

未名企鹅以“连接健康”为使命,致力于提供生命健康领域的大数据产品和解决方案,帮助客户实现数据驱动的业务增长。

未名企鹅中的“未名”代表北大,寓意人文精神,生命健康领域正是体现人文关怀的产业;“企鹅”象征科技,未名企鹅的创始团队毕业于北大,技术力量来自腾讯,公司以未名企鹅命名是希望以人文情怀加上科技力量来推动生命科学行业数字化发展。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页