Apache Kylin 3.x 的 Cube 构建流程

前言

本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见大数据技术体系


正文

Cube 在创建之后只有定义,而没有计算的数据,它的状态是“DISABLED”,是不会被查询引擎挑中的。

关于 Cube 和 Cuboid 请参考我的博客——Cube技术是什么?

要想让 Cube 有数据,还需对它进行构建。

Cube 的构建方式通常有两种:全量构建和增量构建,两者的构建步骤是完全一样的,区别只在于构建时读取的数据源是全集还是子集。

Cube 的构建包含以下步骤,由任务引擎调度执行:

  1. 创建临时的 Hive 平表(从 Hive 中读取数据):
  2. 计算各维度的不同值,并收集各 Cuboid 的统计数据;
  3. 创建并保存字典;
  4. 保存 Cuboid 统计信息;
  5. 创建 HTable;
  6. 计算 Cube (一轮或若干轮计算);
  7. 将 Cube 计算结果转成 HFile;
  8. 加载 HFile 到 HBase;
  9. 更新 Cube 元数据;
  10. 垃圾回收。

预计算会连接运算符,将事实表和维表连接为一张大表,也称平表

创建字典由多个子任务完成,分别是抽取列值、为高基数列构建字典、创建字典、保存统计信息、物化维表、从全局字典得到构建要用到的字典。 是否使用字典用户可以在创建 Cube 的时候进行选择,使用字典的好处是有很好的数据压缩率,可以减少存储空间,同时提升读的速度。 缺点是构建字典需要占用较多的内存资源,创建维度基数超过千万的 Cube 时容易造成内存溢出。 虽然可以通过调换外存来解决,但也是以降低速度为代价。 如果 Cube 用到的维度表是视图,会根据这个视图物化一张临时表,之后的构建都会使用与维表视图相对应的临时表。

上述步骤中,前五步是为计算 Cube 而做的准备工作,如遍历维度值来创建字典,对数据做统计和估算以创建 HTable 等。

第六步是真正的 Cube 计算,取决于使用的 Cube 算法,它可能是一轮 MapReduce 任务,也可能是 N (在没有优化的情况下, N 可以被视作维度数)轮迭代的 MapReduce。

由于 Cube 运算的中间结果是以 SequenceFile 的格式存储在 HDFS 上的,所以为了导入 HBase,还需要进行第七步操作,将这些结果转换成 HFile (HBase 文件存储格式)。

第八步通过使用 HBase BulkLoad 工具,将 HFile 导入 HBase 集群,这一步完成后,HTable 就可以查询到数据。

关于 BulkLoad 请参考我的博客——一篇文章搞懂 HBase 的 BulkLoad 机制

第九步更新 Cube 的数据,将此次构建的 Segment 的状态从“NEW”更新为“READY”,表示已经可供查询。

最后一步,清理构建过程中生成的临时文件等垃圾,释放集群资源。

猜你喜欢

转载自blog.csdn.net/Shockang/article/details/127355613