前言
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 的顺序时需要注意以下几个原则:
- 在查询中被用作过滤条件的维度有可能放在其他维度的前面。
- 将经常出现在查询中的维度放在不经常出现的维度的前面。
- 对于基数较高的维度,如果查询会有这个维度上的过滤条件,那么将它往前调整;如果没有,则向后调整。