前言


Cube 优化

Apache Kylin 的核心思想是根据用户的数据模型和查询样式对数据进行预计算,并在查询时直接利用预计算结果返回查询结果。

Apache Kylin 具有响应时间快、查询时资源需求小、吞吐量大等特点。

在构建 Cube 之前, Cube 的优化手段提供了更多与数据模型或查询样式相关的信息,用于指导构建出体积更小、查询速度更快的 Cube。


1、Cuboid 剪枝优化

在默认情况下, Kylin 会对每一种维度的组合进行预计算,每种维度组合的预计算结果被称为 Cuboid ,这些 Cuboid 组成了 Cube。

当 Cuboid 过多时会对存储区查询性能造成一定的压力。

所以,我们有必要对 Cuboid 进行剪枝优化。

剪枝优化的工具主要有以下两个。

衍生维度

衍生维度用于在有效维度内将维度表上的非主键维度排除掉,并使用维度表的主键(其实是事实表上相应的外键)来替代它们。

Kylin 会在底部记录维度表主键与维度表其他维度之问的映射关系,以便在查询时能够动态地将维度表的主键“翻译”成这些非主键维度,并进行实时聚合。

聚合组

聚合组(Aggregation Group)是一种更为强大的剪枝工具。

聚合组假设一个 Cube 的所有维度均可以根据业务需求划分成若干组(当然也可以是一个组),由于同一个组内的维度更可能被同一个查询用到,因此会表现出更加紧密的内在关联。

对于每个分组内部的维度,用户可以使用三种可选方式定义它们之间的关系:强制维度( Mandatory)、层级维度( Hierarchy)、联合维度(Joint)。


2、并发粒度优化

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


3、Rowkeys 优化

Cube 的每个 Cuboid 中都包含了大量的行,每个行又分为 Rowkeys 和 Measure 部分。

每个 Cuboid 数据中的 Rowkeys 都包含当前 Cuboid 中所有维度值的组合。

编码

编码(Encoding)代表了该维度的值应该使用何种方式进行编码,合适的编码能够减少维度对空间的占用。

目前,Kylin 支持的编码方式有 Date 编码、Time 编码、 Integer 编码、 Dict 编码和 Fixed_length 编码。

按维度分片

默认情况下, Cuboid 的分片策略是随机的。

按维度分片(Shard by Dimension)是一种更加高效的分片策略,即按照某个特定维度进行分片。

简单地说,如果 Cuboid 中某两行的 Shard by Dimesion 的值相同,那么无论这个 Cuboid 最终会被划分成多少个分片,这两行数据必然会被分配到同-个分片中。

调整 Rowkeys 顺序

Kylin 会把所有的维度按照顺宇黏合成一个完整的 Rowkeys,并且按照这个 Rowkeys 升序排列 Cuboid 中所有的行。

在调整 Rowkeys 的顺序时需要注意以下几个原则:

  1. 在查询中被用作过滤条件的维度有可能放在其他维度的前面。
  2. 将经常出现在查询中的维度放在不经常出现的维度的前面。
  3. 对于基数较高的维度,如果查询会有这个维度上的过滤条件,那么将它往前调整;如果没有,则向后调整。