Apache Kylin 入门 6 - 优化 Cube

3,039 阅读5分钟

Apache Kylin 入门系列目录

本文从各个角度总结一些 Kylin 实践相关的最佳实践,不一定非常准确,欢迎批评指正。

一、维度表与事实表

1、维度表

  1. 要具有数据一致性,主键值必须是唯一的(否则 Kylin 构建过程会报错);
  2. 维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询,过大的表不适合作为维度表,默认的阈值是 300MB;
  3. 改变频率低,Kylin 会在每次构建中试图重用维度表的快照(Snapshot),如果维度表经常改变的话,重用就会失效,这就会导致要经常对维度表创建快照;
  4. 维度表最好不要是 Hive 视图(View),因为每次都需要将视图进行物化,从而导致额外的时间开销。

2、事实表

  1. 移除不参与 Cube 构建的字段,可以提升构建速度,降低 Cube 构建结果的大小;
  2. 尽可能将事实表进行维度拆分,提取公用的维度;
  3. 保证维度表与事实表的映射关系,过滤无法映射的记录。

如果维度与事实表无法映射,某些字段(数据类型为 number 系列)会遇到构建失败的问题(numberFormatException('\N')\N 是为 Hive 中 NULL 的实际存储内容);此外,在进行 Left Join 的时候会产生大量的 NULL,这些 NULL 值在真正查询中根本没有任何作用。

3、分区表

Hive 表支持多分区(Partition),简单地说,一个分区就是一个文件目录,存储了特定的数据文件。当有新的数据生成的时候,可以将数据加载到指定的分区,读取数据的时候也可以指定分区。对于 SQL 查询,如果查询中指定了分区列的属性条件,则 Hive 会智能地选择特定分区(也就是目录),从而避免全量数据的扫描,减少读写操作对集群的压力。

Kylin 支持增量的 Cube 构建,通常是按时间属性来增量地从 Hive 表中抽取数据。如果 Hive 表正好是按此时间属性做分区的话,那么就可以利用到 Hive 分区的好处,每次在 Hive 构建的时候都可以直接跳过不相干日期的数据,节省 Cube 构建的时间。这样的列在 Kylin 里也称为分割时间列(Partition Time Column),通常它应该也是 Hive 表的分区列。

二、Cube 构建优化

1、维度优化

  1. 分析查询条件,不参与 Group By 或者 Where 过滤的条件维度一定不要勾选;
  2. 一般而言,Left Join 右侧表里面的字段均可以作为 Derived (衍生)维度;
  3. 必需维度、层级维度、联合维度、衍生维度四种维度优化方案;
  4. 聚合组进一步对维度组合进行优化。

必需维度、层级维度、联合维度、衍生维度以及聚合组可以参看 Apache Kylin 入门 5 一文的详细说明。

2、其他优化

  1. RowKeys 顺序:Mandatory 维度、where 过滤条件中出现频率较多的维度、高基数维度、低基数维度;
  2. ShardBy 设置:建议选择基数较大的列作为 ShardBy 列,以使得数据可以均匀分布;
  3. 数据压缩:Kylin 针对维度字典以及维度表快照采用了特殊的压缩算法,对于 HBase 中的聚合计算数据利用了 Hadoop 的 LZO 或者是 Snappy 等压缩算法,从而保证存储在 HBase 以及内存中的数据尽可能地小;
  4. 对于大的事实表可以采用分区来增量构建,然后设置定期自动合并(Merge)操作;
  5. 事实表中日期数据类型为尽可能设置为 date;
  6. ShardBy 字段有助于全部数据分散分布在各个 Region 中,有助于防止出现数据倾斜等问题;
  7. ShardBy 字段为 True 后,同一个值的数据会存储在一起,便于批量捞取数据。

三、注意事项

1、哪些维度参与了 Cuboid 构建?

很多人会误以为只有聚合组 Includes 里面被选择的维度才参与 Cube 构建的计算,其实真正参与计算是 Dimensions 设置界面选择为 Default 的那些维度,还有 Left Join 的字段(如果其 Derived 字段被勾选)。

简单来说,在 RowKeys 排序界面看到的维度都会参与 Cuboid 的构建,如果在 RowKeys 看到不想参与计算的维度,可以到 Dimensions 设置界面进行修改。

2、结合业务设置层级维度

层级维度在设置的时候一定要深刻理解业务,例如:企业到底归属到行业类型下还是归属到区域类型下?从层级结构的角度来讲都是可以的,深层次挖掘业务需求后我们会发现,凡是查询企业的时候均附带有区域的过滤条件,因此将企业归属到区域的层级下比归属到行业类型下更加有效。

3、善于尝试

在实践中,可能会遇到各种不确定的思路,最佳的做法是去实践,多建立 Model 和 Cube,从不同层次去优化,去尝试,在实践中不断总结经验。


Any Code,Code Any!

扫码关注『AnyCode』,编程路上,一起前行。