1.Kylin集成Spark、Flink
查看官网:http://kylin.apache.org/docs/tutorial/cube_spark.html
2.增量构建
每次构建Cube都会从Hive中批量读取数据,而对于大多数业务场景来说,Hive中的数据处于不断增长的状态。为了使Cube中的数据能够不断更新,且无须重复地为已经处理过的历史数据构建Cube,Apache Kylin引入了增量构建功能。
Apache Kylin中将Cube划分为多个Segment,Segment代表一段时间内源数据的预计算结果,每个Segment都用起始时间和结束时间标记。在大部分情况下,一个Segment的起始时间等于它前面的Segment的结束时间,同理,它的结束时间等于它后面的Segment的起始时间。同一个Cube下不同的Segment除了背后的源数据不同,其他如结构定义、构建过程、优化方法、存储方式等完全相同。
2.1.为什么要增量构建
全量构建可以看作增量构建的一种特例:在全量构建中,Cube中只存在唯一的一个Segment,该Segment没有分割时间的概念,因此也就没有起始时间和结束时间。全量构建和增量构建各有适用的场景,用户可以根据自己的业务场景灵活切换。全量构建和增量构建的详细对比如下所示:
全量构建 | 增量构建 |
---|---|
每次更新都需要更新整个数据集 | 每次更新只对需要更新的时间范围进行更新,离线计算量相对较小 |
查询时不需要合并不同Segment的结果 | 查询时需要合并不同Segment的结果,查询性能会受到影响 |
不需要后续的Segment合并 | 累计一定Segment后,需要进行合并 |
适合小数据量或全表更新的Cube | 适合大数据量的Cube |
对于全量构建来说,当需要更新Cube数据的时候,它不会区分历史数据和新加入的数据,也就是说,进行全量构建时会导入并处理所有的原始数据。而增量构建只会导入新Segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算。
对于小数据量的Cube或经常需要全表更新的Cube,使用全量构建可以以少量的重复计算降低生产环境中的维护复杂度,减少运维精力。而对于大数据量的Cube,如一个包含两年历史数据的Cube,如果使用全量构建每天更新数据,那么每天为了新数据而重复计算过去两年的数据会严重增加查询成本,在这种情况下需要考虑使用增量构建。
2.2. 设计增量Cube
2.2.1. 设计增量Cube的条件
并非所有的Cube都适合进行增量构建,Cube的定义必须包含一个时间维度,用来分割不同的Segment,我们将这样的维度称为分割时间列(Partition DateColumn)。分割时间列可以是Hive中的Date类型、Timestamp类型还可以是String类型。无论是哪种类型,Kylin都要求用户显式地指定分割时间列的数据格式。例如,精确到年月日的Date类型(或String类型)的数据格式可能是“yyyyMMdd”或“yyyy-MM-dd”,如果是精确到时分秒的Timestamp类型(或String类型),那么数据格式可能是“YYYY-MM-DD HH:MM:SS”。
2.2.2. 增量Cube的创建
创建增量Cube的过程和创建普通Cube的过程基本类似,只是增量Cube会有一些额外的配置要求。
1、Model层面的设置,在构建model的时候,在settings中设置
2、Cube层面的设置,
Partition Start Date:是指Cube默认的第一个Segment的起始时间。
Auto Merge Thresholds:用于指定Segment自动合并的阈值
Volatile Range:用来指定最近的不需要进行合并的Segment的天数
Retention Threshold:则用于指定将过期的Segment自动舍弃。
2.3. 触发增量构建
1、配置 Model
增量构建的 Cube 需要指定分割时间列。例如:将日期分区字段添加到维度列中
2.3.1.Web GUI触发
在Web GUI上触发Cube的增量构建与触发全量构建的方式基本相同。在Web GUI的Model页面中,选中想要增量构建的Cube,点击Action→Build命令。不同于全量构建,增量构建的Cube会在此时弹出对话框让用户选择StartDate和EndDate
2.3.2.构建相关的REST API
Kylin 提供了 REST API 帮助自动化地触发增量构建。该API同样适用于非增量构建的 Cube。关于 Kylin的 API 更详细的介绍可以参见 Kylin官网:http://kylin.apache.org/docs/howto/howto_build_cube_with_restapi.html和http://kylin.apache.org/docs/howto/howto_use_restapi.html
2.4.管理Cube碎片
增量构建的Cube每天都可能还有新的增量,这样的Cube日积月累最终可能包含上百个Segment,导致运行时的查询引擎需要聚合多个Segment的结果才能返回正确的查询结果,最终会使查询性能受到严重的影响。从存储引擎的角度来说,大量的Segment会带来大量的文件,这些文件会充斥系统为Kylin所提供的命名空间,给存储空间的多个模块带来巨大的压力,如Zookeeper、HDFS Namenode等。在这种情况下,我们有必要采取措施控制Cube中Segment的数量,如可以自动/手动合并Segment、清理老旧无用的Segment。
另外,有时候用户场景并不能完美地符合增量构建的要求,由于ETL过程存在延迟,数据可能持续更新,用户不得不在增量更新完成后再次刷新过去已经构建好的增量Segment,对于这些问题,需要在设计Cube的时候提前考虑好。
2.4.1.合并Segment
Kylin提供了一种简单的机制来控制Cube中Segment的数量--合并Segment。在WebGUI中选择需要进行Segment合并的Cube,点击Action→Merge命令,然后在对话框中选择需要合并的Segment,可以同时合并多个Segment,但是这些Segment必须是连续的。
完成提交后系统会提交一个类型为MERGE的构建任务,它以选中的Segment中的数据作为输入,将这些Segment的数据合并封装成一个新的Segment。这个新的Segment的起始时间为选中的最早的Segment的起始时间,它的结束时间为选中的最晚的Segment的结束时间。
2.4.2.自动合并
在Cube Designer的 Refresh Settings的页面中有 AutoMerge Thresholds ,Volatile Range和Retention Threshold三个设置项可以用来帮助管理 Segment 碎片。灵活地搭配使用这三项设置可以大大减少对Segment进行管理的工作量。
Auto Merge Thresholds:用于指定Segment自动合并的阈值,允许用户设置几个层级的时间阈值,层级越靠后,时间阈值越大
Volatile Range:用来指定最近的不需要进行合并的Segment的天数
Retention Threshold:则用于指定将过期的Segment自动舍弃。超过该参数设置的保留时间的Segment自动删除。