Apache Kylin 入门 6 - 优化 Cube

Apache Kylin 入门系列目录算法

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

1、维度表与事实表

一、维度表

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

二、事实表

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

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

三、分区表

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

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

2、Cube 构建优化

一、维度优化

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

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

二、其余优化

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

3、注意事项

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

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

简单来讲,在 RowKeys 排序界面看到的维度都会参与 Cuboid 的构建,若是在 RowKeys 看到不想参与计算的维度,能够到 Dimensions 设置界面进行修改。code

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

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

三、善于尝试

在实践中,可能会遇到各类不肯定的思路,最佳的作法是去实践,多创建 Model 和 Cube,从不一样层次去优化,去尝试,在实践中不断总结经验。cdn


Any Code,Code Any!

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

相关文章
相关标签/搜索