Cube Designer 的 Advanced Setting 中可以配置 Aggregation Groups。 理论上 N 维度 Cube 会构建 2^N 个 Cuboid,随着维度的增多,Cuboid 数量会指数增长,存储空间占用增大,构建时间增长。聚合组的目的是对维度分组,减少不必要的维度组合,从而减少 Cuboid 的数量。
分组之后的维度集合支持必要维度,层级维度,联合维度 3 种配置。
用户对一个或几个维度特别敏感,所有的查询中都存在 GROUP BY 这些维度,则可以把这些维度配置为必要维度。
具有层级关系的维度,例如国家 country,省份 province,城市 city。这三个维度的查询有以下三类:
联合维度表示不可分割的维度集合。
Kylin 使用 HBase 作为 Cube 的存储引擎。HBase 是 Hadoop 生态的 Key-Value 数据库,支持按 Key 随机查询和写入,这个 Key 在 HBase 中叫做 Rowkey。
对维度编码,可以将维度值转化为长度一致的字节,合适的编码方式能够有效减少对空间的占用,加速查询效率。
dict
字典编码,将提取纬度的唯一值在内存中构造字典,Rowkey 使用字典的 key 替换纬度值。
字典常驻内存,对查询影响很小,但是字典不能超过缓存大小,否则在 Cube build 过程中会发生缓存溢出。默认 dict 编码字段基数在5,000,000
以内,可以通过kylin.dictionary.max.cardinality
修改,这种情况更好的做法是使用其他编码类型。
dict 字典适用中低基维度,如地区信息,国家,省份,城市。
fixed_length 使用固定长度 N 存储维度值,超过长度部分会截断。如果 N 很大,会造成 Rowkey 过长,HBase 性能下降。 fixed_length 适用超高基场景,如电话号码,IP 等。
fixed_length_hex 针对值为十六进制的维度,比如 Base64 之后的值。
integer
整数类型,不做编码转换。Length
长度范围为 1~8,支持的整数范围[-2^(8*N-1) ~ 2^(8*N-1)]
。
date 日期类型。适用 3 个字节编码。
time 时间戳类型,毫秒部分会忽略。
boolean 适用 1 个字节表示布尔值。
HBase 中的数据按照 Rowkey 的字典排序顺序存储。
Rowkeys 可以为一个(最多也只有一个)维度配置Shard By
值为true
。
Cube 在构建过程中需要 将中间表的数据分布到 HDFS 节点,默认 partition 方式是随机。如果指定分片维度,则使用分片维度做 partition。partition 的目的是防止中间表大小差异造成数据倾斜,因此 Shard By 维度应该使用高基维度,以使分片粒度足够小,能够加速之后的 MR 计算任务。
注意分片维度和 Cube 的 Partition 维度不同,前者作用于构建阶段,后者是用于分割时间段以支持增量构建
Kylin 默认将所有度量放在 HBase 的 1 个列簇中。 每个 COUNT DISTINCT 度量使用 bitmap 存储明细数据,这样的度量基数一般都很大。多个这样的度量存储在同 1 个列簇计算量很大,可以将超过一个的 COUNT DISTINCT 或 TopN 度量, 放在更多列簇中(不同的列簇保存在不同的 Store 中),以优化与 HBase 的 I/O。 注意,HBase 的列簇最好控制在 2-3 个
在 LookupTable 可以设置列为Normal
或者Derived
。
当一个或多个维度能够从另一个维度(一般为事实表的外键)推导出来,可以考虑将这个列设置为派生列。派生列不会参与 Cube 计算。
New Model
中New Join Condition
,左边为事实表的外键,右边为 lookup 表的主键
为了支持任意粒度的上卷聚合,精确去重需要保存明细数据,所以使用 Bitmap 保存精确去重度量数据。Kylin 使用 RoaringBitmap 库。 RoaringBitmap 只支持 Int 类型的数据,所以 Kylin 引入了全局字典,以保证在不同 Segment 上,String 到 Int 的映射一致。全局字典的核心数据结构是 AppendTrieDictionary。
Kylin 的近似去重,基于 HLL (HyperLogLog)实现。 简单来说,每个需要被计数的值都会经过特定 Hash 函数的计算,将得到的哈希值放入到 byte 数组中,最后根据特定算法对 byte 数据的内容进行统计,就可以得到近似的去重结果。
膨胀率是指 Cube 大小 /原始 Table 大小。膨胀率应该控制在 10 倍以内。 影响 Cube 大小的因素:
UHC 代表 Ultra High Cardinality,即超高基数。基数表示维度不同值的数量。通常,维度的基数从数十到数百万。如果超过百万,我们将其称为超高基维度,例如:用户 ID,电话号码等。