kylin-增量构建Cube

1、全量和增量的区别

对于全量构建来说,每当需要更新Cube数据的时候,它不会区分历史数据和新加入的数据,也就是说,在构建的时候会导入并处理所有的原始数据。
我们将Cube划分为多个Segment,每个Segment用起始时间和结束时间来标志。Segment代表一段时间内源数据的预计算结果。增量构建只会导入新Segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算。
在这里插入图片描述
最后,我们可以得到这样的结论:对于小数据量的Cube,或者经常需要全表更新的Cube,使用全量构建需要更少的运维精力,以少量的重复计算降低生产环境中的维护复杂度。而对于大数据量的Cube,例如,对于一个包含两年历史数据的Cube,如果需要每天更新,那么每天为了新数据而去重复计算过去两年的数据就会变得非常浪费,在这种情况下需要考虑使用增量构建。

2、增量构建的前提

并非所有的Cube都适用于增量构建,Cube的定义必须包含一个时间维度,用来分割不同的Segment,我们将这样的维度称为分割时间列(Partition Date Column)。

· Model层面的设置:
在Model Designer的最后一步Settings会添加分割时间列,如图:
在这里插入图片描述
补充:Has aseparate”time of the day“column选项的作用:
在一些用户场景中,年月日和时分秒并不体现在同一个列上,例如在用户的事实表上有两个列,分别是“日期”和“时间”,分别保存记录发生的日期(年月日)和时间(时分秒),对于这样的场景,允许用户指定一个额外的分割时间列来指定除了年月日之外的时分秒信息。为了区分,我们将之前的分割时间列称为常规分割时间列,将这个额外的列称为补充分割时间列。在勾选了“Has aseparate”time of the day“column?”选项之后,用户可以选择一个符合时分秒时间格式的列作为补充的分割时间列。

· Cube层面的设置
在Cube Designer的“Refresh Settings”中。包含“Auto Merge Thresholds”、“Retention Threshold”和“Partition StartDate”。
在这里插入图片描述
“Partition Start Date”是指Cube默认的第一个Segment的起始时间。同一个Model下不同的Cube可以指定不同的起始时间
“Auto Merge Thresholds”用于指定Segment自动合并的阈值,
“Retention Threshold”则用于指定将过期的Segment自动抛弃

3、增量构建的触发

在Web GUI的Model页面中,选中想要增量构建的Cube,单击Action→Build。
不同于全量构建,增量构建的Cube会在此时弹出对话框让用户选择“End Date”,目前Kylin要求增量Segment的起始时间等于Cube中最后一个Segment的结束时间,因此当我们为一个已经有Segment的Cube触发增量构建时,“Start Date”的值已经被确定,且不能修改。如果在触发增量构建的时候Cube中不存在任何的Segment,那么“StartDate”的值会被系统设置为“Partition Start Date”的值。
在这里插入图片描述

在这里插入图片描述
在进行增量构建时,将增量部分的起始时间和结束时间作为增量构建请求的一部分提交给Kylin的任务引擎,任务引擎会根据起始时间和结束时间从Hive中抽取相应时间的数据,并对这部分数据做预计算处理,然后将预计算的结果封装成为一个新的Segment,并将相应的信息保存到元数据和存储引擎中。
在JOB step1″Create Intermediate Flat Hive Table”可以看到:

Create and distribute table, cmd: 
hive -e "USE default;

DROP TABLE IF EXISTS kylin_intermediate_cube_incr_3_8ff2496d_8d5d_09c3_a9a7_aa84f52c1276;
CREATE EXTERNAL TABLE IF NOT EXISTS kylin_intermediate_cube_incr_3_8ff2496d_8d5d_09c3_a9a7_aa84f52c1276
(
\`KYLIN_SALES_PART_DT\` date
,\`KYLIN_SALES_SELLER_ID\` bigint
,\`KYLIN_SALES_OPS_REGION\` string
)
STORED AS SEQUENCEFILE
LOCATION 'hdfs://gd2:8020/kylin/kylin_metadata/kylin-5b2b9f02-786f-26dd-ee5c-4b22e371409e/kylin_intermediate_cube_incr_3_8ff2496d_8d5d_09c3_a9a7_aa84f52c1276';
ALTER TABLE kylin_intermediate_cube_incr_3_8ff2496d_8d5d_09c3_a9a7_aa84f52c1276 SET TBLPROPERTIES('auto.purge'='true');
INSERT OVERWRITE TABLE \`kylin_intermediate_cube_incr_3_8ff2496d_8d5d_09c3_a9a7_aa84f52c1276\` SELECT
\`KYLIN_SALES\`.\`PART_DT\` as \`KYLIN_SALES_PART_DT\`
,\`KYLIN_SALES\`.\`SELLER_ID\` as \`KYLIN_SALES_SELLER_ID\`
,\`KYLIN_SALES\`.\`OPS_REGION\` as \`KYLIN_SALES_OPS_REGION\`
 FROM \`DEFAULT\`.\`KYLIN_SALES\` as \`KYLIN_SALES\`
LEFT JOIN \`DEFAULT\`.\`KYLIN_ACCOUNT\` as \`KYLIN_ACCOUNT\`
ON \`KYLIN_SALES\`.\`SELLER_ID\` = \`KYLIN_ACCOUNT\`.\`ACCOUNT_ID\`
WHERE 1=1 AND (\`KYLIN_SALES\`.\`PART_DT\` >= '2012-01-14' AND \`KYLIN_SALES\`.\`PART_DT\` < '2012-01-21')
;

" --hiveconf hive.merge.mapredfiles=false --hiveconf hive.auto.convert.join=true --hiveconf dfs.replication=2 --hiveconf hive.exec.compress.output=true --hiveconf hive.auto.convert.join.noconditionaltask=true --hiveconf mapreduce.job.split.metainfo.maxsize=-1 --hiveconf hive.merge.mapfiles=false --hiveconf hive.auto.convert.join.noconditionaltask.size=100000000 --hiveconf hive.stats.autogather=true
ls: cannot access /opt/cloudera/parcels/SPARK2-2.3.0.cloudera2-1.cdh5.13.3.p0.316101/lib/spark2/lib/spark-assembly-*.jar: No such file or directory
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.16.2-1.cdh5.16.2.p0.8/jars/hive-common-1.1.0-cdh5.16.2.jar!/hive-log4j.properties
OK
Time taken: 1.906 seconds
OK
Time taken: 0.046 seconds
OK
Time taken: 0.849 seconds
OK
Time taken: 0.89 seconds
Query ID = root_20200611164444_54919364-439f-4988-83a6-d8363bdb4afb
Total jobs = 1
Execution log at: /tmp/root/root_20200611164444_54919364-439f-4988-83a6-d8363bdb4afb.log
2020-06-11 04:44:08	Starting to launch local task to process map join;	maximum memory = 19089326082020-06-11 04:44:09	Dump the side-table for tag: 1 with group count: 10000 into file: file:/tmp/root/23d176a0-45d0-4506-b6fc-3778158420ee/hive_2020-06-11_16-44-06_441_1460799768032424703-1/-local-10002/HashTable-Stage-4/MapJoin-mapfile01--.hashtable
2020-06-11 04:44:09	End of local task; Time Taken: 0.505 sec.
Execution completed successfully
MapredLocal task succeeded
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1591773281588_0053, Tracking URL = http://gd1:8088/proxy/application_1591773281588_0053/
Kill Command = /opt/cloudera/parcels/CDH-5.16.2-1.cdh5.16.2.p0.8/bin/../lib/hadoop/bin/hadoop job  -kill job_1591773281588_0053
Hadoop job information for Stage-4: number of mappers: 1; number of reducers: 0
2020-06-11 16:44:15,985 Stage-4 map = 0%,  reduce = 0%
2020-06-11 16:44:21,186 Stage-4 map = 100%,  reduce = 0%, Cumulative CPU 2.61 sec
MapReduce Total cumulative CPU time: 2 seconds 610 msec
Ended Job = job_1591773281588_0053
Loading data to table default.kylin_intermediate_cube_incr_3_8ff2496d_8d5d_09c3_a9a7_aa84f52c1276
Table default.kylin_intermediate_cube_incr_3_8ff2496d_8d5d_09c3_a9a7_aa84f52c1276 stats: [numFiles=1, numRows=105, totalSize=780, rawDataSize=2909]
MapReduce Jobs Launched: 
Stage-Stage-4: Map: 1   Cumulative CPU: 2.61 sec   HDFS Read: 807467 HDFS Write: 916 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 610 msec
OK
Time taken: 16.674 seconds

4、合并

4.1 合并的好处

增量构建的Cube,由于不同时间的数据分布在不同的Segment之中,因此为了获得完整的数据,查询引擎需要向存储引擎请求读取各个Segment的数据。当然,查询引擎会根据查询中的条件自动跳过不感兴趣的Segment。
对于全量构建的Cube,查询引擎只需要向存储引擎访问单个Segment所对应的数据,从存储层返回的数据无需进行Segment之间的聚合,但是这也并非意味着查询全量构建的Cube不需要查询引擎做任何额外的聚合,为了加强性能,单个Segment的数据也有可能被分片存储到引擎的多个分区上,从而导致查询引擎可能仍然需要对单个Segment不同分区的数据做进一步的聚合。
当然,整体来说,增量构建的Cube上的查询会比全量构建的做更多的运行时聚合,而这些运行时聚合都发生在单点的查询引擎之上,因此通常来说增量构建的Cube上的查询会比全量构建的Cube上的查询要慢一些。
可以看到,日积月累,增量构建的Cube中的Segment越来越多,根据上一段的分析可以猜测到该Cube的查询性能也会越来越慢,因为需要在单点的查询引擎中完成越来越多的运行时聚合。为了保持查询性能,Cube的管理员需要定期地将某些Segment合并在一起,或者让Cube根据Segment保留策略自动地淘汰那些不会再被查询到的陈旧Segment。
不仅如此,从存储角度来说,大量的Segment会带来大量的文件,这些文件会充斥所提供的命名空间,给存储空间的多个模块带来巨大的压力,例如Zookeeper、HDFS Namenode等。因此,有必要采取措施控制Cube中Segment的数量。

4.2 合并的方式

手动合并
单击Action→Merge,然后在对话框中选中需要合并的Segment,可以同时合并多个Segment。注意这些Segment必须是连续的。
单击提交后系统会提交一个类型为“MERGE”的构建任务,它以选中的Segment中的数据作为输入,将这些Segment的数据合并封装成为一个新的Segment。这个新的Segment的起始时间为选中的最早的Segment的起始时间,它的结束时间为选中的最晚的Segment的结束时间。
自动合并
创建Cube的时候说过,在Cube Designer的“Refresh Settings”的页面中有“Auto Merge Thresholds”和“Retention Threshold”两个设置项可以用来帮助管理Segment碎片。
在这里插入图片描述
1、“Auto Merge Thresholds”
允许用户设置几个层级的时间阈值,层级越靠后,时间阈值就越大。举例来说,用户可以为一个Cube指定(7天、28天)这样的层级。每当Cube中有新的Segment状态变为READY的时候,就会触发一次系统试图自动合并的尝试。系统首先会尝试最大一级的时间阈值,结合上面的(7天、28天)层级的例子,首先查看是否能将连续的若干个Segment合并成为一个超过28天的大Segment,在挑选连续Segment的过程中,如果遇到已经有个别Segment的时间长度本身已经超过了28天,那么系统会跳过该Segment,从它之后的所有Segment中挑选连续的累积超过28天的Segment。如果满足条件的连续Segment还不能够累积超过28天,那么系统会使用下一个层级的时间阈值重复寻找的过程。每当找到了能够满足条件的连续Segment,系统就会触发一次自动合并Segment的构建任务,在构建任务完成之后,新的Segment被设置为READY状态,自动合并的整套尝试又需要重新再来一遍。
举例来说,如果现在有A~H 8个连续的Segment,它们的时间长度分别为28天(A)、7天(B)、1天(C)、1天(D)、1天(E)、1天(F)、1天(G)、1天(H)。此时第9个Segment I加入,它的时间长度为1天,那么现在Cube中总共存在9个Segment。系统首先尝试能否将连续的Segment合并到28天这个阈值上,由于Segment A已经超过28天,它会被排除。接下来的B到H加起来也不足28天,因此第一级的时间阈值无法满足,退一步系统尝试第二级的时间阈值,也就是7天。系统重新扫描所有的Segment,发现A和B已经超过7天,因此跳过它们,接下来发现将Segment C到I合并起来可以达到7天的阈值,因此系统会提交一个合并Segment的构建请求,将Segment C到I合并为一个新的Segment X。X的构建完成之后,Cube中只剩下三个Segment,分别是原来的A(28天),B(7天)和新的X(7天)。由于X的加入,触发了系统重新开始整个合并尝试,但是发现已经没有满足自动合并的条件,既没有连续的、满足条件的、累积超过28天的Segment,也没有连续的、满足条件的、累积超过7天的Segment,尝试终止。

2、 “Retention Threshold”
从碎片管理的角度来说,自动合并是将多个Segment合并为一个Segment,以达到清理碎片的目的。保留Segment则是从另外一个角度帮助实现碎片管理,那就是及时清理不再使用的Segment。
在很多业务场景中,只会对过去一段时间内的数据进行查询,例如对于某个只显示过去1年数据的报表,支撑它的Cube事实上只需要保留过去一年内的Segment即可。由于数据在Hive中往往已经存在备份,因此无需再在Kylin中备份超过一年的历史数据。
在这种情况下,我们可以将“Retention Threshold”设置为365。每当有新的Segment状态变为READY的时候,系统会检查每一个Segment:如果它的结束时间距离最晚的一个Segment的结束时间已经大于“RetentionThreshold”,那么这个Segment将被视为无需保留。系统会自动地从Cube中删除这个Segment。

如果启用了“Auto Merge Thresholds”,那么在使用“Retention Threshold”的时候需要注意,不能将“Auto Merge Thresholds”的最大层级设置得太高。假设我们将“Auto Merge Thresholds”的最大一级设置为1000天,而将“Retention Threshold”设置为365天,那么受到自动合并的影响,新加入的Segment会不断地被自动合并到一个越来越大的Segment之中,糟糕的是,这会不断地更新这个大Segment的结束时间,从而导致这个大Segment永远不会得到释放。因此,推荐自动合并的最大一级的时间不要超过1年。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值