CSDN|原来 Kylin 的增量构建,大有学问! | 原力计划


CSDN|原来 Kylin 的增量构建,大有学问! | 原力计划
本文插图
作者| Alice菌责编 | 王晓曼出品 | CSDN博客Kylin增量构建应用场景 Kylin 在每次 Cube 的构建都会从 Hive 中批量读取数据 , 而对于大多数业务场景来说 , Hive 中的数据处于不断增长的状态 。 为了支持 Cube 中的数据能够不断地得到更新 , 且无需重复地为已经处理过的历史数据构建 Cube , 因此对于 Cube 引入了增量构建的功能 。 1、理解 Cube、Cuboid 与 Segment 的关系Kylin 将 Cube 划分为多个 Segment(对应就是 HBase 中的一个表) , 每个Segment 用起始时间和结束时间来标志 。 Segment 代表一段时间内源数据的预计算结果 。 一个 Segment 的起始时间等于它之前那个 Segment 的结束时间 , 同理 , 它的结束时间等于它后面那个 Segment 的起始时间 。 同一个 Cube 下不同的 Segment 除了背后的源数据不同之外 , 其他如结构定义、构建过程、优化方法、存储方式等都完全相同 。 CSDN|原来 Kylin 的增量构建,大有学问! | 原力计划
本文插图
一个 Cube , 可以包含多个 Cuboid , 而 Segment 是指定时间范围的 Cube , 可以理解为 Cube 的分区 。 对应就是 HBase 中的一张表 , 该表中包含了所有的 Cuboid。 例如:以下为针对某个Cube的Segment 。 CSDN|原来 Kylin 的增量构建,大有学问! | 原力计划
本文插图
2、全量构建与增量构建 全量构建在全量构建中 , Cube 中只存在唯一的一个 Segment, 该 Segment 没有分割时间的概念 , 也就没有起始时间和结束时间 。 全量构建和增量构建各有其适用的场景 , 用户可以根据自己的业务场景灵活地进行切换 。 对于全量构建来说 , 每当需要更新Cube数据的时候 , 它不会区分历史数据和新加入的数据 , 也就是说 , 在构建的时候会导入并处理所有的原始数据 。 CSDN|原来 Kylin 的增量构建,大有学问! | 原力计划
本文插图
增量构建增量构建只会导入新 Segment 指定的时间区间内的原始数据 , 并只对这部分原始数据进行预计算 。 CSDN|原来 Kylin 的增量构建,大有学问! | 原力计划
本文插图
全量构建与增量构建的Cube查询方式对比:(1)全量构建Cube

  • 查询引擎只需向存储引擎访问单个 Segment 所对应的数据 , 无需进行 Segment 之间的聚合;
  • 为了加强性能 , 单个 Segment 的数据也有可能被分片存储到引擎的多个分区上 , 查询引擎可能仍然需要对单个 Segment 不同分区的数据做进一步的聚合 。
(2)增量构建 Cube
  • 由于不同时间的数据分布在不同的 Segment 之中 , 查询引擎需要向存储引擎请求读取各个 Segment 的数据;
  • 增量构建的 Cube 上的查询会比全量构建的做更多的运行时聚合 , 通常来说增量构建的 Cube 上的查询会比全量构建的 Cube 上的查询要慢一些 。
对于小数据量的 Cube , 或者经常需要全表更新 Cube , 使用全量构建需要更少的运维精力 , 以少量的重复计算降低生产环境中的维护复杂度 。 而对于大数据量的 Cube , 例如 , 对于一个包含两年历史数据的 Cube , 如果需要每天更新 , 那么每天为了新数据而去重复计算过去两年的数据就会变得非常浪费 , 在这种情况下需要考虑使用增量构建 。
CSDN|原来 Kylin 的增量构建,大有学问! | 原力计划
本文插图
增量构建 Cube 过程 1、指定分割时间列增量构建 Cube 的定义必须包含一个时间维度 , 用来分割不同的 Segment , 这样的维度称为分割时间列(Partition Date Column) 。 2、增量构建过程


推荐阅读