从之前章节的介绍可以知道,在没有采取任何优化措施的情况下,Kylin会对每一种维度的组合进行预计算,每种维度的组合的预计算结果被称为Cuboid。假设有4个维度,我们最终会有24 =16个Cuboid需要计算。

但在现实情况中,用户的维度数量一般远远大于4个。假设用户有10 个维度,那么没有经过任何优化的Cube就会存在210 =1024个Cuboid;而如果用户有20个维度,那么Cube中总共会存在220 =1048576个Cuboid。虽然每个Cuboid的大小存在很大的差异,但是单单想到Cuboid的数量就足以让人想象到这样的Cube对构建引擎、存储引擎来说压力有多么巨大。因此,在构建维度数量较多的Cube时,尤其要注意Cube的剪枝优化(即减少Cuboid的生成)。

1.找到问题Cube

1.1 检查Cuboid数量

Apache Kylin提供了一个简单的工具,供用户检查Cube中哪些Cuboid 最终被预计算了,我们称其为被物化(Materialized)的Cuboid。同时,这种方法还能给出每个Cuboid所占空间的估计值。由于该工具需要在对数据进行一定阶段的处理之后才能估算Cuboid的大小,因此一般来说只能在Cube构建完毕之后再使用该工具。目前关于这一点也是该工具的一大不足,由于同一个Cube的不同Segment之间仅是输入数据不同,模型信息和优化策略都是共享的,所以不同Segment中哪些Cuboid被物化哪些没有被物化都是一样的。因此只要Cube中至少有一个Segment,那么就能使用如下的命令行工具去检查这个Cube中的Cuboid状态:

bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader CUBE_NAME
CUBE_NAME:想要查看的cube的名字

例如:

[luomk@hadoop102 kylin]$ bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader FirstCube… …… …Statistics of FirstCube[FULL_BUILD]Cube statistics hll precision: 14Total cuboids: 7Total estimated rows: 51Total estimated size(MB): 3.027915954589844E-4
Sampling percentage:  100
Mapper overlap ratio: 1.0
Mapper number: 1
Length of dimension DEFAULT.EMP.JOB is 1
Length of dimension DEFAULT.EMP.MGR is 1
Length of dimension DEFAULT.EMP.DEPTNO is 1
|---- Cuboid 111, est row: 10, est MB: 0|---- Cuboid 011, est row: 9, est MB: 0, shrink: 90%|---- Cuboid 001, est row: 3, est MB: 0, shrink: 33.33%|---- Cuboid 010, est row: 7, est MB: 0, shrink: 77.78%|---- Cuboid 101, est row: 9, est MB: 0, shrink: 90%|---- Cuboid 100, est row: 5, est MB: 0, shrink: 55.56%
|---- Cuboid 110, est row: 8, est MB: 0, shrink: 80%

从分析结果的下半部分可以看到,所有的Cuboid及它的分析结果都以树状的形式打印了出来。在这棵树中,每个节点代表一个Cuboid,每个Cuboid都由一连串1或0的数字组成,如果数字为0,则代表这个Cuboid中不存在相应的维度;如果数字为1,则代表这个Cuboid中存在相应的维度。除了最顶端的Cuboid之外,每个Cuboid都有一个父亲Cuboid,且都比父亲Cuboid少了一个“1”。其意义是这个Cuboid就是由它的父亲节点减少一个维度聚合而来的(上卷)。最顶端的Cuboid称为Base Cuboid,它直接由源数据计算而来。

每行Cuboid的输出中除了0和1的数字串以外,后面还有每个Cuboid 的的行数与父亲节点的对比(Shrink值)。所有Cuboid行数的估计值之和应该等于Segment的行数估计值,每个Cuboid都是在它的父亲节点的基础上进一步聚合而成的,因此从理论上说每个Cuboid无论是行数还是大小都应该小于它的父亲。在这棵树中,我们可以观察每个节点的Shrink值,如果该值接近100%,则说明这个Cuboid虽然比它的父亲Cuboid少了一个维度,但是并没有比它的父亲Cuboid少很多行数据。换而言之,即使没有这个Cuboid, 我们在查询时使用它的父亲Cuboid,也不会有太大的代价。那么我们就可以对这个Cuboid进行剪枝操作。

1.2 检查Cube大小

还有一种更为简单的方法可以帮助我们判断Cube是否已经足够优化。在Web GUI的Model页面选择一个READY状态的Cube,当我们把光标移到该Cube的Cube Size列时,Web GUI会提示Cube的源数据大小,以及当前Cube的大小除以源数据大小的比例,称为膨胀率(Expansion Rate),如图所示:

一般来说,Cube的膨胀率应该在0%~1000%之间,如果一个Cube的膨胀率超过1000%,那么Cube管理员应当开始挖掘其中的原因。通常,膨胀率高有以下几个方面的原因。

(1) Cube中的维度数量较多,且没有进行很好的Cuboid剪枝优化,导致Cuboid数量极多;

(2) Cube中存在较高基数的维度,导致包含这类维度的每一个Cuboid占用的空间都很大,这些Cuboid累积造成整体Cube体积变大;

(3) 存在比较占用空间的度量,例如Count Distinct,因此需要在Cuboid的每一行中都为其保存一个较大的寄存器,最坏的情况将会导致Cuboid中每一行都有数十KB,从而造成整个Cube的体积变大;

因此,对于Cube膨胀率居高不下的情况,管理员需要结合实际数据进行分析,可灵活地运用接下来介绍的优化方法对Cube进行优化。

2.优化构建

2.1 使用聚合组

聚合组(Aggregation Group)是一种强大的剪枝工具。聚合组假设一个Cube的所有维度均可以根据业务需求划分成若干组(当然也可以是一个组),由于同一个组内的维度更可能同时被同一个查询用到,因此会表现出更加紧密的内在关联。每个分组的维度集合均是Cube所有维度的一个子集,不同的分组各自拥有一套维度集合,它们可能与其他分组有相同的维度,也可能没有相同的维度。每个分组各自独立地根据自身的规则贡献出一批需要被物化的Cuboid,所有分组贡献的Cuboid的并集就成为了当前Cube中所有需要物化的Cuboid的集合。不同的分组有可能会贡献出相同的Cuboid,构建引擎会察觉到这点,并且保证每一个Cuboid无论在多少个分组中出现,它都只会被物化一次。

对于每个分组内部的维度,用户可以使用如下三种可选的方式定义,它们之间的关系,具体如下。

(1) 强制维度(Mandatory),如果一个维度被定义为强制维度,那么这个分组产生的所有Cuboid中每一个Cuboid都会包含该维度。每个分组中都可以有0个、1个或多个强制维度。如果根据这个分组的业务逻辑,则相关的查询一定会在过滤条件或分组条件中,因此可以在该分组中把该维度设置为强制维度。

(2) 层级维度(Hierarchy),每个层级包含两个或更多个维度。假设一个层级中包含D1,D2…Dn这n个维度,那么在该分组产生的任何Cuboid中, 这n个维度只会以(),(D1),(D1,D2)…(D1,D2…Dn)这n+1种形式中的一种出现。每个分组中可以有0个、1个或多个层级,不同的层级之间不应当有共享的维度。如果根据这个分组的业务逻辑,则多个维度直接存在层级关系,因此可以在该分组中把这些维度设置为层级维度。

(3) 联合维度(Joint),每个联合中包含两个或更多个维度,如果某些列形成一个联合,那么在该分组产生的任何Cuboid中,这些联合维度要么一起出现,要么都不出现。每个分组中可以有0个或多个联合,但是不同的联合之间不应当有共享的维度(否则它们可以合并成一个联合)。如果根据这个分组的业务逻辑,多个维度在查询中总是同时出现,则可以在该分组中把这些维度设置为联合维度。

这些操作可以在Cube Designer的Advanced Setting中的Aggregation Groups区域完成,如下图所示。

聚合组的设计非常灵活,甚至可以用来描述一些极端的设计。假设我们的业务需求非常单一,只需要某些特定的Cuboid,那么可以创建多个聚合组,每个聚合组代表一个Cuboid。具体的方法是在聚合组中先包含某个Cuboid所需的所有维度,然后把这些维度都设置为强制维度。这样当前的聚合组就只能产生我们想要的那一个Cuboid了。

再比如,有的时候我们的Cube中有一些基数非常大的维度,如果不做特殊处理,它就会和其他的维度进行各种组合,从而产生一大堆包含它的Cuboid。包含高基数维度的Cuboid在行数和体积上往往非常庞大,这会导致整个Cube的膨胀率变大。如果根据业务需求知道这个高基数的维度只会与若干个维度(而不是所有维度)同时被查询到,那么就可以通过聚合组对这个高基数维度做一定的“隔离”。我们把这个高基数的维度放入一个单独的聚合组,再把所有可能会与这个高基数维度一起被查询到的其他维度也放进来。这样,这个高基数的维度就被“隔离”在一个聚合组中了,所有不会与它一起被查询到的维度都没有和它一起出现在任何一个分组中,因此也就不会有多余的Cuboid产生。这点也大大减少了包含该高基数维度的Cuboid的数量,可以有效地控制Cube的膨胀率。

2.2 并发粒度优化

当Segment中某一个Cuboid的大小超出一定的阈值时,系统会将该Cuboid的数据分片到多个分区中,以实现Cuboid数据读取的并行    化,从而优化Cube的查询速度。具体的实现方式如下:构建引擎根据Segment估计的大小,以及参数“kylin.hbase.region.cut”的设置决定Segment在存储引擎中总共需要几个分区来存储,如果存储引擎是HBase,那么分区的数量就对应于HBase中的Region数量。kylin.hbase.region.cut的默认值是5.0,单位是GB,也就是说对于一个大小估计是50GB的Segment,构建引擎会给它分配10个分区。用户还可以通过设置kylin.hbase.region.count.min(默认为1)和kylin.hbase.region.count.max(默认为500)两个配置来决定每个Segment最少或最多被划分成多少个分区。

由于每个Cube的并发粒度控制不尽相同,因此建议在Cube Designer 的Configuration Overwrites(上图所示)中为每个Cube量身定制控制并发粒度的参数。假设将把当前Cube的kylin.hbase.region.count.min设置为2,kylin.hbase.region.count.max设置为100。这样无论Segment的大小如何变化,它的分区数量最小都不会低于2,最大都不会超过100。相应地,这个Segment背后的存储引擎(HBase)为了存储这个Segment,也不会使用小于两个或超过100个的分区。我们还调整了默认的kylin.hbase.region.cut,这样50GB的Segment基本上会被分配到50个分区,相比默认设置,我们的Cuboid可能最多会获得5倍的并发量。

2.3 Rowkey 的优化

编码

按维度分片

调整Rowkey顺序

2.4 其他优化

降低度量精度

及时清理无用的Segment

Kylin 之Cube 构建优化相关推荐

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

    Kylin Cube构建优化 联机分析处理OLAP是一种软件技术,它使分析人员能够迅速.一致.交互地从各个方面观察信息,以达到 深入理解数据的目的. 多维数据组织OLAP的使用一般有两种背景条件: Ø ...

  2. Kylin Cube构建优化

    Kylin Cube构建优 一:使用衍生维度(derived dimension) 衍生维度用于在有效维度内将维度表上的非主键维度排除掉,并使用维度表的主键(其实是事实表上相应的外键)来替代它们.Ky ...

  3. shell调度kylin的cube构建任务

    shell调度kylin的cube调度任务 shell shell 1 #!/bin/bash2 3 echo "kylin_host_port:${1}"4 echo " ...

  4. 【电商数仓】数仓即席查询之Kylin Cube构建原理和构建优化

    文章目录 一 Kylin Cube构建原理 1 维度和度量 2 Cube和Cuboid 3 Cube构建算法 (1)逐层构建算法(layer) (2)快速构建算法(inmem) 4 Cube存储原理 ...

  5. Kylin高级主题-Cube构建算法介绍(逐层算法和快速算法)

    Apache Kylin是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据.它能在亚秒内查询巨大的Hive表.本文将详细介绍Apache Ky ...

  6. CC00016.kylin——|HadoopOLAP_Kylin.V16|——|Kylin.v16|Cube优化|检查Cuboid数量|

    一.检查Cuboid数量 ### --- 检查Cuboid数量~~~ Apache Kylin提供了一个简单的工具, ~~~ 检查Cube中哪些Cuboid最终被预计算了,称这些Cuboid为被物化的 ...

  7. Kylin实践(二)--Cube构建

    接上篇:Kylin实践(一)--Hadoop环境搭建 https://blog.csdn.net/isscici06/article/details/80624797 ---------------- ...

  8. kylin KV+cube方案分析

    2019独角兽企业重金招聘Python工程师标准>>> 前言   在使用Kylin的时候,最重要的一步就是创建cube的模型定义,即指定度量和维度以及一些附加信息,然后对cube进行 ...

  9. 原来 Kylin 的增量构建,大有学问! | 原力计划

    作者| Alice菌 责编 | 王晓曼 出品 | CSDN博客 Kylin增量构建应用场景 Kylin 在每次 Cube 的构建都会从 Hive 中批量读取数据,而对于大多数业务场景来说,Hive 中 ...

  10. Kylin 4 使用和优化在有赞的实践

    在 2021年5月29日举办的 QCon 全球软件开发者大会上,来自有赞的数据基础平台负责人 郑生俊 在大数据开源框架与应用专题上分享了有赞内部对 Kylin 4.0 的使用经历和优化实践,对于众多 ...

最新文章

  1. 《构建实时机器学习系统》一1.8 实时机器学习模型的生存期
  2. 输入流中的read和readfully方法区别和原理
  3. 领域模型架构 eShopOnWeb项目分析 上
  4. windows安装版mysql_windows下非安装版 mysql配置
  5. 在互联网寒冬季节,他竟然是这样进了百度!值得学习 -- 来自最前沿的实战经验!...
  6. 极简桌面 android 2.3,极简桌面(手机桌面)V3.1 for android 免费版
  7. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_5 自定义类型转换器演示异常
  8. Swift - iCloud存储介绍
  9. 几本适合嵌入式软件工程师阅读的电子入门书
  10. 近期量子计算论文总结
  11. 一个五年架构师为什么基本年薪酬可以达到50万?
  12. 篮球大师显示连接服务器,nba篮球大师能和好友联机打吗 能自己操作吗
  13. 教你使用 koa2 + vite + ts + vue3 + pinia 构建前端 SSR 企业级项目
  14. 在iOS中调用C语言的国密算法SM2以替换RSA
  15. bzoj 1984: 月下“毛景树” 线段树+树链剖分
  16. 常用screen命令
  17. 带倍速播放的播放器_带有HTML5的MP3播放器
  18. 刚走上工作岗位的程序员——如何看待业务和技术
  19. php生成占位图,Laravel4创建一个占位图片服务例子
  20. python笔记手写_手写笔记的压缩与增强

热门文章

  1. 企业组织架构的架构图用思维导图软件怎么做?
  2. 关于移动端H5获取微信非静默授权被拦截进入【微信快照页】问题及解决方案
  3. 【渝粤题库】陕西师范大学180102 广告策划 作业(高起专)
  4. 出版物设计排版工具:Swift Publisher 5 for Mac
  5. 基于Cocos2d-x游戏引擎实战开发炸弹超人
  6. DIrectX错误,提示显卡驱动更新
  7. C# 添加windows右键菜单
  8. 单元测试总结反思_语文期中考试总结反思
  9. Java基础Day04
  10. 桥本分数c语言,桥本分数式问题的C++算法