5.1 找到问题 Cube

5.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 的 Name.

例如:

bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader sav_cube

...

============================================================================
Statistics of sav_cube[FULL_BUILD]

Cube statistics hll precision: 14
Total cuboids: 7
Total estimated rows: 51
Total 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 进行剪枝操作。


5.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 体积变大;

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

Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-04-02 05:47:19

results matching ""

    No results matching ""