Kylin:增量构建Cube

Cube的使用包含创建构建两个过程。

创建可以理解为“定义数据结构的过程”
构建可以理解为“往定义好的数据结构中添加计算数据的过程”

Segment

在增量构建中,将 Cube 划分为多个 Segment,每个 Segment 用起始时间和结束时间标志。Segment 代表一段时间内源数据的预计算结果。一个 Segment 的起始时间等于它之前那个 Segment 的结束时间(前闭后开),同理,它的结束时间等于它后面那个 Segment 的起始时间。同一个 Cube 下不同的 Segment 的结构定义、构建过程、优化方法、存储方式等完全相同。

前提

并非所有的 Cube 都适用于增量构建,Cube 的定义必须包含一个时间维度,用来分割不同的 Segment,该维度称为分割时间列。同一个 Model 下不同 Cube 的分割时间列应该是相同的,因此在 Kylin 中将分割时间列的定义放到了 Model 中。

Cube 的配置

Cube 每次增量构建都会生成一个 Segment,随着时间的推移,当前 Cube 会存在大量的 Segments,这时候会产生以下两个问题:

  • 执行查询时查询引擎要聚合多个 Segments 的结果才能返回正确的查询结果,聚合的 Segments 越多,查询的性能越差
  • 每个 Segments 都对应 Hbase 的一张表,过多的 Segments 会在底层的存储系统产生大量的文件,会给存储系统 HDFS NameNode 带来压力

可以在Cube层面进行以下设置来让 Kylin 按照一定的规则自动合并 Segments:

  • Partition Start Date:指 Cube 默认的第一个 Segment 的起始时间。同一个 Model 下不同的 Cube 可以指定不同的起始时间
  • Auto Merge Thresholds:用于指定 Segment 自动合并的阈值,将在后文详述
  • Retention Threshold:保留最近设置阈值的 cube segments 个数,默认是 0,它会保留所有历史构建的 segments

触发增量构建

在进行增量构建时,将增量部分的起始时间和结束时间作为增量构建的一部分提交给 Kylin 的任务引擎,任务引擎会根据起始时间和结束时间从 Hive 中抽取相应时间的数据,并对这部分数据做预计算处理,然后将预计算的结果封装为一个新的 Segment,并将相应的信息保存到元数据和存储引擎中。

当我们为一个已经有 Segment 的 Cube 触发增量构建的时候,起始时间的值已经被确定,不能被修改。如果 Cube 中不存在任何的 Segment,那么 Start Date 的值会被设置为 Partition Start Date(在 Model 中设定)。

仅当 Cube 中不存在任何 Segment,或者不存在任何未完成的构建任务时,Kylin 才接受 Cube 上新的构建任务。未完成的构建任务不仅包含正在运行中的构建任务,还包括已经出错并处于 ERROR 的任务。

Kylin 提供 Rest API 以帮助自动化地触发增量构建:
Build cube(http://kylin.apache.org/cn/docs/howto/howto_use_restapi.html#build-cube)

管理Cube碎片(Segments)

Auto Merge Thresholds允许用户设置几个层级的时间阈值,层级约靠后,时间阈值就越大。举例来说,[7days, 28days]这个层级,每当 Cube 中有新的 Segment 生成时,就会触发一次自动合并的尝试:

  • 首先查看是否能将连续的若干个 Segments 合并成为一个超过 28 天的大 Segment。

在挑选连续 Segments 的过程中:

  • 如果遇到已经有个别 Segment 的时间长度已经超过 28 天,那么系统会跳过该 Segment,从它之后的所有 Segment 中挑选连续的积累超过 28 天的 Segment
  • 如果满足条件的连续 Segments 还不能够积累超过 28 天,则系统会使用下一个层级的时间阈值重复寻找过程

你可能感兴趣的:(Kylin:增量构建Cube)