apache-kylin-3.1.3-bin-hadoop3 系列文章
1、apache-kylin-3.1.3-bin-hadoop3介绍及部署、验证详解
2、apache-kylin-3.1.3-bin-hadoop3集群部署
3、apache-kylin-3.1.3-bin-hadoop3基本操作(创建model和cube、数据查詢)
4、apache-kylin-3.1.3-bin-hadoop3增量构建、全量构建详细示例
5、apache-kylin-3.1.3-bin-hadoop3 segment管理及JDBC操作
6、apache-kylin-3.1.3-bin-hadoop3 cube优化方向及减少cuboids和降低膨胀率详细示例
文章目录
本文详细了介绍了关于全量构建和增量构建的步骤以及增量构建的2种方式。日常工作中更多的还是使用增量构建,其中增量构建的方式有通过kylin页面和通过restful接口形式进行构建。
本文依赖hive和kylin环境好用。
本文分为三部分,即增量构建介绍、与全量构建的区别和增量构建详细示例。
本文部分数据来源于互联网。
一、Kylin增量构建
1、应用场景
Kylin在每次Cube的构建都会从Hive中批量读取数据,对于大多数业务场景来说,Hive中的数据处于不断增长的状态。
为了支持Cube中的数据能够不断地得到更新,且无需重复地为已经处理过的历史数据构建Cube,因此对于Cube引入了增量构建的功能
2、Cube、Cuboid与Segment的关系
Kylin将Cube划分为多个Segment(对应就是HBase中的一个表),每个Segment用起始时间和结束时间来标志,Segment代表一段时间内源数据的预计算结果。
一个Segment的起始时间等于它之前那个Segment的结束时间,同理,它的结束时间等于它后面那个Segment的起始时间。
同一个Cube下不同的Segment除了背后的源数据不同之外,其他如结构定义、构建过程、优化方法、存储方式等都完全相同。
Segmnt示例
一个Cube,可以包含多个Cuboid,而Segment是指定时间范围的Cube,可以理解为Cube的分区,对应就是HBase中的一张表。该表中包含了所有的Cuboid。
例如:以下为针对某个Cube的Segment
二、全量构建与增量构建
1、全量构建
在全量构建中,Cube中只存在唯一的一个Segment,该Segment没有分割时间的概念,也就没有起始时间和结束时间。
对于全量构建来说,每当需要更新Cube数据的时候,它不会区分历史数据和新加入的数据,也就是说,在构建的时候会导入并处理所有的原始数据。
2、增量构建
只会导入新Segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算。
3、全量构建和增量构建的对比
全量构建与增量构建的Cube查询方式对比:
- 全量构建Cube
查询引擎只需向存储引擎访问单个Segment所对应的数据,无需进行Segment之间的聚合
为了加强性能,单个Segment的数据也有可能被分片存储到引擎的多个分区上,查询引擎可能仍然需要对单个Segment不同分区的数据做进一步的聚合 - 增量构建Cube
由于不同时间的数据分布在不同的Segment之中,查询引擎需要向存储引擎请求读取各个Segment的数据
增量构建的Cube上的查询会比全量构建的做更多的运行时聚合,通常来说增量构建的Cube上的查询会比全量构建的Cube上的查询要慢一些
一般使用推荐:
- 对于小数据量的Cube,或者经常需要全表更新的Cube,使用全量构建需要更少的运维精力,以少量的重复计算降低生产环境中的维护复杂度。
- 对于大数据量的Cube,例如,对于一个包含多年历史数据的Cube,如果需要每天更新,那么每天为了新数据而去重复计算过去多年的数据就会变得非常浪费,在这种情况下需要考虑使用增量构建
三、增量构建Cube示例
1、指定分割时间列
增量构建Cube的定义必须包含一个时间维度,用来分割不同的Segment,这样的维度称为分割时间列(Partition Date Column)。
2、增量构建过程
- 在进行增量构建时,将增量部分的起始时间和结束时间作为增量构建请求的一部分提交给Kylin的任务引擎
- 任务引擎会根据起始时间和结束时间从Hive中抽取相应时间的数据,并对这部分数据做预计算处理
- 将预计算的结果封装成为一个新的Segment,并将相应的信息保存到元数据和存储引擎中。一般来说,增量部分的起始时间等于Cube中最后一个Segment的结束时间。
1)、增量Cube的创建
1、前期数据准备
-- 1. 创建用户维度表
create table `test`.`dim_user`(
id string,
name string
)
row format delimited fields terminated by ',';
-- 2. 创建订单事实表
create table `test`.`fact_order`(
order_id string,
user_id string,
price int
)
partitioned by (dt string) row format delimited fields terminated by ',';
--3. 将hive表同步至kylin中
--在kylin数据源datbase中进行同步
创建增量Cube的过程和创建普通Cube的过程基本类似,只是增量Cube会有一些额外的配置要求
2、配置Model
增量构建的Cube需要指定分割时间列。例如:将日期分区字段添加到维度列中
将日期分区字段添加到维度列中
注意选择格式化日期
保存即可
3、构建cube
4、导入数据
- 装载数据
load data local inpath '/usr/local/bigdata/testdata/data_dim_user.txt' overwrite into table `test`.`dim_user`;
load data local inpath '/usr/local/bigdata/testdata/data_order_20191011.txt' overwrite into table `test`.`fact_order` partition(dt='20191011');
5、构建
- 构建后的segmnt
注意构建Cube时,选择的分区时间为,起始时间(包含)、结束时间(不包含),对应了从Hive从获取数据源的条件
INSERT OVERWRITE TABLE `kylin_intermediate_cube_order_1582ee64_45f9_cf22_bef2_e0b455efc284`
SELECT
`FACT_ORDER`.`DT` as `FACT_ORDER_DT`
,`FACT_ORDER`.`USER_ID` as `FACT_ORDER_USER_ID`
,`FACT_ORDER`.`PRICE` as `FACT_ORDER_PRICE`
FROM `ITCAST_KYLIN_DW`.`FACT_ORDER` as `FACT_ORDER`
INNER JOIN `ITCAST_KYLIN_DW`.`DIM_USER` as `DIM_USER` ON `FACT_ORDER`.`USER_ID` = `DIM_USER`.`ID`
WHERE 1=1 AND (`FACT_ORDER`.`DT` >= '20191011' AND `FACT_ORDER`.`DT` < '20191012');
- 验证运行结果
select
t1.dt,
t2.id,
t2.name,
sum(t1.price) as total_money
from fact_order t1
inner join dim_user t2 on t1.user_id = t2.id
group by t1.dt,t2.id, t2.name;
2)、增量构建
构建 20191012、20191013的Cube数据
1、通过kylin的页面进行构建
- 导入数据
-- 装载数据,本示例把数据一次性装载完成,实际应用中可能数据是按照不同的时间频率来做
load data local inpath '/usr/local/bigdata/testdata/data_order_20191012.txt' overwrite into table `test`.`fact_order` partition(dt='20191012');
load data local inpath '/usr/local/bigdata/testdata/data_order_20191013.txt' overwrite into table `test`.`fact_order` partition(dt='20191013');
- 构建
- 验证
2、REST API触发增量构建
在Web GUI上进行的所有操作,其背后调用的都是同一套Rest API。将来可以SHELL脚本调度REST API触发构建。
注意
- Kylin中Cube构建的时间采用CST(北京时间),而REST提交的时间采用的是UTC(世界标准时间)
- CST = UTC + 8
- startTime、endTime提交到Kylin,应该 +8 个小时
//示例JSON:
{
"startTime": 1571011200000,#毫秒,秒后面加000
"endTime": 1571097600000,#毫秒
"buildType": "BUILD"
}
时间戳转换工具:http://tool.chinaz.com/Tools/unixtime.aspx
- 导入数据
load data local inpath '/usr/local/bigdata/testdata/data_order_20191014.txt' overwrite into table `test`.`fact_order` partition(dt='20191014');
- 构建
1、认证
目前Kylin使用basic authentication。
给第一个请求加上用于认证的 Authorization 头部。
或者进行一个特定的请求: POST http://server4:7070/kylin/api/user/authentication 。
完成认证后, 客户端可以在接下来的请求里带上cookie。
2、获取Cube的详细信息
GET http://server4:7070/kylin/api/cubes?cubeName={cube_name}&limit=15&offset=0
用户可以在返回的cube详细信息里找到cube的segment日期范围。
3、然后提交cube构建任务
- PUT http://server4:7070/kylin/api/cubes/{cube_name}/rebuild
- 关于 put 的请求体细节请参考 Build Cube API
1、startTime 和 endTime 应该是utc时间。
2、buildType 可以是 BUILD 、 MERGE 或 REFRESH。 BUILD 用于构建一个新的segment, REFRESH 用于刷新一个已有的segment, MERGE 用于合并多个已有的segment生成一个较大的segment。
- 这个方法会返回一个新建的任务实例,它的uuid是任务的唯一id,用于追踪任务状态。
- 跟踪任务状态
GET http://server4:7070/kylin/api/jobs/{job_uuid}
返回的 job_status 代表job的当前状态。 - 如果构建任务出现错误,可以重新开始它
PUT http://server4:7070/kylin/api/jobs/{job_uuid}/resume
- 验证
以上,详细了介绍了关于全量构建和增量构建的步骤以及增量构建的2种方式。