Kylin的诞生背景
- Kylin-中国团队研发的,是第一个真正由中国人自己主导、从零开始、自主研发、并成为Apache顶级开源项目
- Hive的性能比较慢,支持SQL灵活查询,特别慢
- HBase的性能快,原生不支持SQL - phoenix:可以写sql语句来查询hbase!!
- Kylin是将先将数据进行预处理,将预处理的结果放在HBase中。效率很高
Kylin的应用场景
Kylin 典型的应用场景如下:
- 用户数据存在于Hadoop HDFS中,利用Hive将HDFS文件数据以关系数据方式存取,数据量巨大,在500G以上
- 每天有数G甚至数十G的数据增量导入
- 有10个以内较为固定的分析维度
Kylin 的核心思想是利用空间换时间,在数据 ETL 导入 OLAP 引擎时提前计算各维度的聚合结果并持久化保存
为什么要使用Kylin
- Kylin 是一个 Hadoop 生态圈下的 MOLAP 系统,是 ebay 大数据部门从2014 年开始研发的支持 TB 到 PB 级别数据量的分布式 Olap 分析引擎。其特点包括:
- 可扩展的超快的 OLAP 引擎
- 提供 ANSI-SQL 接口
- 交互式查询能力
- MOLAP Cube 的概念
- 与 BI 工具可无缝整合
Kylin的总体架构
- Kylin 依赖于 Hadoop、Hive、Zookeeper 和 Hbase
一、Kylin安装
依赖环境
软件 |
版本 |
Apache hbase-1.1.1-bin.tar.gz |
1.1.1 |
spark-2.2.0-bin-2.6.0-cdh5.14.0.tgz |
2.2.0-bin-cdh5.14.0 |
apache-kylin-2.6.3-bin-hbase1x.tar.gz |
2.6.3 |
集群规划
主机名 |
IP |
守护进程 |
node1 |
192.168.88.120 |
NameNode DataNode RunJar(Hive metastore) RunJar(Hive hiveserver2) QuorumPeerMain HMaster HRegionServer kylin NodeManager |
node2 |
192.168.88.121 |
SecondaryNameNode JobHistoryServer DataNode HRegionServer QuorumPeerMain ResourceManager HistoryServer NodeManager |
node3 |
192.168.88.122 |
HRegionServer NodeManager DataNode QuorumPeerMain |
注意:
- kylin-2.6.3-bin-hbase1x所依赖的hbase为1.1.1版本
- 要求hbase的hbase.zookeeper.quorum值必须只能是host1,host2,...。不允许出现host:2181
安装kylin-2.6.3-bin-hbase1x
tar -zxf /export/softwares/apache-kylin-2.6.3-bin-hbase1x.tar.gz -C /export/servers/
增加kylin依赖组件的配置
/export/servers/apache-kylin-2.6.3-bin-hbase1x/conf
cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml hdfs-site.xml
cp $HADOOP_HOME/etc/hadoop/core-site.xml core-site.xml
cp $HBASE_HOME/conf/hbase-site.xml hbase-site.xml
cp $HIVE_HOME/conf/hive-site.xml hive-site.xml
cp $SPARK_HOME/conf/spark-defaults.conf spark-defaults.conf
配置kylin.sh
/export/servers/apache-kylin-2.6.3-bin-hbase1x/bin
vim kylin.sh
export HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export HIVE_HOME=/export/servers/hive-1.1.0-cdh5.14.0
export HBASE_HOME=/export/servers/hbase-1.1.1
export SPARK_HOME=/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0
配置conf/kylin.properties
修改 资料\Kylin\kylin_配置文件\kylin.properties 中HDFS的路径,然后上传到 Linux的 Kylin/conf文件夹中
初始化kylin在hdfs上的数据路径
hadoop fs -mkdir -p /apps/kylin
启动集群
1、启动zookeeper
2、启动HDFS
3、启动YARN集群
4、启动HBase集群
5、启动 metastore
nohup hive --service metastore &
6、启动 hiverserver2
nohup hive --service hiveserver2 &
7、启动Yarn history server
mr-jobhistory-daemon.sh start historyserver
8、启动spark history server【可选】
sbin/start-history-server.sh
9、启动kylin
./kylin.sh start
10、登录Kylin
http://node1:7070/kylin
url
默认用户名
ADMIN
默认密码
KYLIN
- 用户名和密码都必须是大写
二、入门案例
测试数据表结构介绍
1、(事实表)dw_sales
列名 |
列类型 |
说明 |
id |
string |
订单id |
date1 |
string |
订单日期 |
channelid |
string |
订单渠道(商场、京东、天猫) |
productid |
string |
产品id |
regionid |
string |
区域名称 |
amount |
int |
商品下单数量 |
price |
double |
商品金额 |
2、(维度表_渠道方式)dim_channel
列名 |
列类型 |
说明 |
channelid |
string |
渠道id |
channelname |
string |
渠道名称 |
3、(维度表_产品名称)dim_product
列名 |
列类型 |
说明 |
productid |
string |
产品id |
productname |
string |
产品名称 |
4、(维度表_区域)dim_region
列名 |
类类型 |
说明 |
regionid |
string |
区域id |
regionname |
string |
区域名称 |
导入测试数据
为了方便后续学习Kylin的使用,需要准备一些测试表、测试数据。
- Hive中创建表
- 将数据从本地文件导入到Hive
操作步骤
1、使用 beeline 连接Hive
!connect jdbc:hive2://node1:10000
2、创建并切换到 itcast_dw 数据库
create database itcast_kylin_dw;
use itcast_kylin_dw;
3、找到资料中的hive.sql文件,执行sql、创建测试表
文件免费下载地址:hive.sql
hive -f hive.sql
-- 查看表是否创建成功
show tables;
4、在home目录创建~/dat_file 文件夹,并将测试数据文件上传到该文件夹中
mkdir ~/dat_file
导入数据到表中
5、执行一条SQL语句,确认数据是否已经成功导入
select * from dw_sales;
按照日期统计订单总额/总数量(Hive方式)
操作步骤:
1、使用beeline连接Hive
2、切换到itcast_dw数据库
3、编写SQL语句
操作步骤:
1、使用beeline连接Hive
2、切换到itcast_dw数据库
use itcast_dw
3、在代码目录中创建sql文件,编写SQL语句
select date1, sum(price) as total_money, sum(amount) as total_amount from dw_sales group by date1,channelid;
按照日期统计订单总额/总数量(Kylin方式)
要使用Kylin进行OLAP分析,需要按照以下方式来进行。
1、创建项目(Project)
2、创建数据源(DataSource)
- 指定有哪些数据需要进行数据分析
3、创建模型(Model)
- 指定具体要对哪个事实表、那些维度进行数据分析
4、创建立方体(Cube)
- 指定对哪个数据模型执行数据预处理,生成不同维度的数据
5、执行构建、等待构建完成
6、再执行SQL查询,获取结果
- 从Cube中查询数据
操作步骤
创建项目(Project)
创建数据源(DataSource)
- 将Hive中的表都导入到Kylin中
- 在添加表名中,指定数据库名
itcast_kylin_dw.dim_channel,itcast_kylin_dw.dim_product,itcast_kylin_dw.dim_region,itcast_kylin_dw.dw_sales
创建模型(Model)
1、 指定模型名称
2、 指定事实表
3、 指定维度表
4、 指定待分析的指标
5、 指定分区和过滤条件
创建立方体(Cube)
1、选择数据模型
2、指定维度
3、指定度量
4、指定刷新设置
5、指定执行引擎
执行构建
执行SQL语句分析
在Insight选项卡中,执行以下SQL语句
select
date1,
sum(price) as total_money,
sum(amount) as total_amount
from
dw_sales
group by date1;
按照订单渠道名称统计订单总额/总数量
1、创建Model
- 指定关联表、关联条件
2、创建Cube
3、执行构建、等待构建完成
4、执行SQL查询,获取结果
select
t2.channelid,
t2.channelname,
sum(t1.price) as total_money,
sum(t1.amount) as total_amount
from
dw_sales t1
inner join dim_channel t2
on t1.channelid = t2.channelid
group by t2.channelid, t2.channelname
按照日期、区域、产品维度统计订单总额/总数量
1、创建Model
指定关联表、关联条件
指定维度字段
2、创建Cube
- 指定cube维度
3、执行构建、等待构建完成
4、执行SQL查询,获取结果
select
t1.date1,
t2.regionid,
t2.regionname,
t3.productid,
t3.productname,
sum(t1.price) as total_money,
sum(t1.amount) as total_amount
from
dw_sales t1
inner join dim_region t2
on t1.regionid = t2.regionid
inner join dim_product t3
on t1.productid = t3.productid
group by
t1.date1,
t2.regionid,
t2.regionname,
t3.productid,
t3.productname
order by
t1.date1,
t2.regionname,
t3.productname
三、Kylin的工作原理
Apache Kylin的工作原理本质上是 MOLAP(多维立方体分析)
维度和度量
- 维度就是观察数据的角度,例如:
- 电商的销售数据,可以从时间的维度来观察,也可以细化从时间和地区的维度来观察
- 统计时,可以把维度值相同的记录聚合在一起,然后应用聚合函数做累加、平均、去重计数等聚合计算
- 度量就是被聚合的统计值,也是聚合运算的结果。
时间(维度) |
销售额(度量) |
2019 1Q |
1.7M |
2019 2Q |
2.1M |
2019 3Q |
1.6M |
2019 4Q |
1.8M |
时间(维度) |
地区(维度) |
销售额(度量) |
2019 1Q |
中国 |
1.0M |
2019 1Q |
北美 |
0.7M |
2019 2Q |
中国 |
1.5M |
2019 2Q |
北美 |
0.6M |
2019 3Q |
中国 |
0.9M |
2019 3Q |
北美 |
0.7M |
2019 4Q |
中国 |
0.9M |
2019 4Q |
北美 |
0.9M |
Cube和Cuboid
- 一个数据表或数据模型上的字段就它们要么是维度,要么是度量(可以被聚合)
- 给定一个数据模型,可以对其上的所有维度进行组合。对于N个维度来说,组合的所有可能性共有2 的N 次方种
- 对于每一种维度的组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为Cuboid(立方形)
- 所有维度组合的Cuboid作为一个整体,被称为Cube(立方体)。一个Cube就是许多按维度聚合的物化视图的集合。
说明 |
维度1地区 |
维度2时间 |
维度3 |
维度4 |
取值 |
0或1 |
0或1 |
0或1 |
0或1 |
- 数据立方体
- Cube 是所有 dimession 的组合
- 每一种 dimession 的组合称之为cuboid(立方形)。某一有 n 个 dimession 的 cube 会有 2^n个 cuboid
- 数据立方体只是多维模型的一个形象的说法
- 为什么叫立方体?
- 立方体本身只有三维,但多维模型不仅限于三维模型,可以组合更多的维度
- 为了与传统关系型数据库的二维表区别开来,才有了数据立方体的叫法
工作原理
Apache Kylin的工作原理是对数据模型做Cube预计算,并利用计算的结果加速查询。具体工作过程如下。
- 指定数据模型,定义维度和度量
- 预计算Cube,计算所有Cuboid并保存为物化视图(存储到hbase中)
- 执行查询时,读取Cuboid,运算,产生查询结果
高效OLAP分析:
- Kylin的查询过程不会扫描原始记录,而是通过预计算预先完成表的关联、聚合等复杂运算
- 利用预计算的结果来执行查询,相比非预计算的查询技术,其速度一般要快一到两个数量级,在超大的数据集上优势更明显
- 数据集达到千亿乃至万亿级别时,Kylin的速度可以超越其他非预计算技术1000倍以上
技术架构
Apache Kylin系统可以分为在线查询和离线构建两部分。
在线查询模式主要处于上半部分,离线构建处于下半部分。以下为Kylin技术架构的具体内容:
- 数据源主要是Hadoop Hive,数据以关系表的形式输入,且必须符合星形模型,保存着待分析的用户数据。根据元数据的定义,构建引擎从数据源抽取数据,并构建Cube
- Kylin可以使用MapReduce或者Spark作为构建引擎。构建后的Cube保存在右侧的存储引擎中,一般选用HBase作为存储
- 完成了离线构建后,用户可以从上方查询系统发送SQL进行查询分析
- Kylin提供了各种Rest API、JDBC/ODBC接口。无论从哪个接口进入,SQL最终都会来到Rest服务层,再转交给查询引擎进行处理
- SQL语句是基于数据源的关系模型书写的,而不是Cube
- Kylin在设计时,刻意对查询用户屏蔽了Cube的概念
- 分析师只需要理解简单的关系模型就可以使用Kylin,没有额外的学习门槛,传统的SQL应用也很容易迁移
- 查询引擎解析SQL,生成基于关系表的逻辑执行计划,然后将其转译为基于Cube的物理执行计划,最后查询预计算生成的Cube并产生结果,整个过程不会访问原始数据源
四、Kylin增量构建
应用场景
Kylin在每次Cube的构建都会从Hive中批量读取数据,而对于大多数业务场景来说,Hive中的数据处于不断增长的状态。为了支持Cube中的数据能够不断地得到更新,且无需重复地为已经处理过的历史数据构建Cube,因此对于 Cube引入了增量构建的功能
理解Cube、Cuboid与Segment的关系
Kylin将Cube划分为多个Segment(对应就是HBase中的一个表),每个Segment用起始时间和结束时间来标志。Segment代表一段时间内源数据的预计算结果。一个Segment的起始时间等于它之前那个Segment的结束时间,同理,它的结束时间等于它后面那个Segment的起始时间。同一个Cube下不同的Segment除了背后的源数据不同之外,其他如结构定义、构建过程、优化方法、存储方式等都完全相同。
一个Cube,可以包含多个Cuboid,而Segment是指定时间范围的Cube,可以理解为Cube的分区。对应就是HBase中的一张表。该表中包含了所有的Cuboid。
例如:以下为针对某个Cube的Segment
Segment名称 |
分区时间 |
HBase表名 |
201910110000000-201910120000000 |
20191011 |
KYLIN_41Z8123 |
201910120000000-201910130000000 |
20191012 |
KYLIN_5AB2141 |
201910130000000-201910140000000 |
20191013 |
KYLIN_7C1151 |
201910140000000-201910150000000 |
20191014 |
KYLIN_811680 |
201910150000000-201910160000000 |
20191015 |
KYLIN_A11AD1 |
全量构建与增量构建
全量构建
在全量构建中,Cube中只存在唯一的一个Segment,该Segment没有分割时间的概念,也就没有起始时间和结束时间。全量构建和增量构建各有其适用的场景,用户可以根据自己的业务场景灵活地进行切换。对于全量构建来说,每当需要更新Cube数据的时候,它不会区分历史数据和新加入的数据,也就是说,在构建的时候会导入并处理所有的原始数据。
增量构建
增量构建只会导入新Segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算。
全量构建和增量构建的对比
全量构建 |
增量构建 |
每次更新时都需要更新整个数据集 |
每次只对需要更新的时间范围进行更新,因此离线计算量相对较小 |
查询时不需要合并不同Segment的结果 |
查询时需要合并不同Segment的结果,因此查询性能会受影响 |
不需要后续的Segment合并 |
累计一定量的Segment之后,需要进行合并 |
适合小数据量或全表更新的Cube |
适合大数据量的Cube |
全量构建与增量构建的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的结束时间。
增量Cube的创建
创建增量Cube的过程和创建普通Cube的过程基本类似,只是增量Cube会有一些额外的配置要求
1、配置Model
增量构建的Cube需要指定分割时间列。例如:将日期分区字段添加到维度列中
在设置中,配置分区列,并指定日期格式
注意事项
- 注意构建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');
2、参看Segment
3、构建 20191012、20191013的Cube数据
INSERT OVERWRITE TABLE `kylin_intermediate_cube_order_16b6b739_cf24_fa63_c9bb_f8932b8c5d15` 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` >= '20191012' AND `FACT_ORDER`.`DT` < '20191013');
4、查看增量构建Cube对应的Segment
REST API触发增量构建
在Web GUI上进行的所有操作,其背后调用的都是同一套Rest API。将来可以SHELL脚本调度REST API触发构建。
属性 |
值 |
URL |
http://node1:7070/kylin/api/cubes/{Cube名称}/rebuild |
请求方式 |
PUT |
RequestBody(JSON字符串) |
{"startTime":时间戳, "endTime": "时间戳", "buildType": "BUILD/MERGE/REFRESH"} |
注意:
- Kylin中Cube构建的时间采用CST(北京时间),而REST提交的时间采用的是UTC(世界标准时间)
- CST = UTC + 8
- startTime、endTime提交到Kylin,应该 +8 个小时
参考JSON:
{
"startTime": "1570838400000",
"endTime": "1570924800000",
"buildType": "BUILD"
}
时间戳转换工具:
http://tool.chinaz.com/Tools/unixtime.aspx
五、Cube碎片管理
增量构建的问题
日积月累,增量构建的Cube中的Segment越来越多,该Cube的查询性能也会越来越慢,因为需要在单点的查询引擎中完成越来越多的运行时聚合。为了保持查询性能:
- 需要定期地将某些Segment合并在一起
- 或者让Cube根据Segment保留策略自动地淘汰那些不会再被查询到的陈旧Segment
管理Cube碎片
上述案例,每天都会生成一个Segment,对应就是HBase中的一张表。增量构建的Cube每天都可能会有新的增量。这样的Cube中最终可能包含上百个Segment,这将会导致Kylin性能受到严重的影响。
- 从执行引擎的角度来说,运行时的查询引擎需要聚合多个Segment的结果才能返回正确的查询结果
- 从存储引擎的角度来说,大量的Segment会带来大量的文件,给存储空间的多个模块带来巨大的压力,例如Zookeeper、HDFS Namenode等
因此,有必要采取措施控制Cube中Segment的数量。
手动触发合并Segment
Kylin提供了一种简单的机制用于控制Cube中Segment的数量:合并Segments。在Web GUI中选中需要进行Segments合并的Cube,
操作步骤:
1、单击Action→Merge
2、选中需要合并的Segment,可以同时合并多个Segment,但是这些Segment必须是连续的
单击提交后系统会提交一个类型为“MERGE”的构建任务,它以选中的Segment中的数据作为输入,将这些Segment的数据合并封装成为一个新的Segment。新的Segment的起始时间为选中的最早的Segment的起始时间,它的结束时间为选中的最晚的Segment的结束时间。
注意事项
- 在MERGE类型的构建完成之前,系统将不允许提交这个Cube上任何类型的其他构建任务
- 在MERGE构建结束之前,所有选中用来合并的Segment仍然处于可用的状态
- 当MERGE构建结束的时候,系统将选中合并的Segment替换为新的Segment,而被替换下的Segment等待将被垃圾回收和清理,以节省系统资源
删除Segment
使用WebUI删除Cube的segment
1、disable Cube
2、点击 delete Segment,删除指定的segment
使用Postman发送请求删除Segment
属性 |
值 |
URL |
http://node1:7070/kylin/api/cubes/{cubeName}/segs/{segmentName} |
请求方式 |
DELETE |
自动合并
手动维护Segment很繁琐,人工成本很高,Kylin中是可以支持自动合并Segment。
在Cube Designer的“Refresh Settings”的页面中有:
- Auto Merge Thresholds
- Retention Threshold
两个设置项可以用来帮助管理Segment碎片。这两项设置搭配使用这两项设置可以大大减少对Segment进行管理的麻烦。
1、Auto Merge Thresholds
- 允许用户设置几个层级的时间阈值,层级越靠后,时间阈值就越大
- 每当Cube中有新的Segment状态变为 READY的时候,会自动触发一次系统自动合并
- 合并策略
达到了阈值就跳过,没有达到阈值就合并到这个阈值,没满足不合并。
尝试最大一级的时间阈值,例如:针对(7天、28天)层级的日志,先检查能否将连续的若干个Segment合并成为一个超过28天的大Segment
- 如果有个别的Segment的时间长度本身已经超过28天,系统会跳过Segment
- 如果满足条件的连续Segment还不能够累积超过28天,那么系统会使用下一个层级的时间阈值重复寻找
示例1 - 理解Kylin自动合并策略
- 假设自动合并阈值设置为7天、28天
- 如果现在有A-H8个连续的Segment,它们的时间长度为28天(A)、7天(B)、1天(C)、1天(D)、1天(E)、1天(F)、1天(G)、1天(H)
- 此时,第9个Segment I加入,时间长度为1天。
自动合并策略为:
- Kylin判断时候能将连续的Segment合并到28天这个阈值,由于Segment A已经超过28天,会被排除
- 剩下的连续Segment,所有时间加一起 B + C + D + E + F + G + H + I (7 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 14) < 28天,无法满足28天阈值,开始尝试7天阈值
- 跳过A(28)、B(7)均超过7天,排除
- 剩下的连续Segment,所有时间加一起 C + D + E + F + G + H + I(1 + 1 + 1 + 1 + 1 + 1 + 1 = 7)达到7天阈值,触发合并,提交Merge任务。并构建一个Segment X(7天)
- 合并后,Segment为:A(28天)、B(7天)、X(7天)
- 继续触发检查,A(28天)跳过,B + X(7 + 7 = 14)< 28天,不满足第一阈值,重新使用第二阈值触发
- 跳过B、X,尝试终止
2、示例:配置自动合并4天的Segment
操作步骤:
1、配置自动合并阈值为(4、28)
2、分别按照天构建分区Cube
3、自动触发合并Segment构建
自动删除Segment
自动合并是将多个Segment合并为一个Segment,以达到清理碎片的目的。自动删除Segment则是及时清理不再使用的Segment。
在很多场景中,只会对过去一段时间内的数据进行查询,例如:
- 对于某个只显示过去1年数据的报表
- 支撑它的Cube其实只需要保留过去一年类的Segment即可
- 由于数据在Hive中已经存在备份,则无需在Kylin中备份超过一年的历史数据
可以将Retention Threshold设置为365。每当有新的Segment状态变为READY的时候,系统会检查每一个Segment。如果它的结束时间距离最晚的一个Segment的结束时间已经大于等于“Retention Threshold”,那么这个Segment将被视为无需保留。系统会自动地从Cube中删除这个Segment。
需求:
- 配置保留Segment为2天,分别构建增量Segment,测试Segment保留情况
操作步骤:
1、在Cube中设置Retension Threshold为2
2、重新构建Cube
3、测试超过指定保留时间的Segment,是否被自动移除
六、使用JDBC连接操作Kylin
- 要将数据以可视化方式展示出来,需要使用Kylin的JDBC方式连接执行SQL,获取Kylin的执行结果
- 使用Kylin的JDBC与JDBC操作MySQL一致
- jdbc url
- jdbc:kylin://node1:7070/itcast_dw
- 用户名密码:ADMIN/KYLIN
需求
通过JDBC方式,查询按照日期、区域、产品维度统计订单总额/总数量结果
开发步骤
- 导入驱动依赖
<dependencies>
<!-- Kylin -->
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
</dependencies>
1、加载驱动
2、创建Connection连接对象
3、构建SQL语句
4、创建Statement对象,并执行executeQuery
5、打印结果
参考代码
public static void main(String[] args) throws Exception {
// 1、加载驱动
Class.forName("org.apache.kylin.jdbc.Driver");
// 2、创建Connection连接对象
// 连接字符串:jdbc:kylin://ip地址:7070/项目名称(project)
Connection connection = DriverManager.getConnection("jdbc:kylin://node1:7070/itcast_dw",
"ADMIN",
"KYLIN");
// 3、创建Statement对象,并执行executeQuery,获取ResultSet
Statement statement = connection.createStatement();
// 构建SQL和语句
String sql = "select\n" +
" t1.date1,\n" +
" t2.regionname,\n" +
" productname,\n" +
" sum(t1.price) as total_money,\n" +
" sum(t1.amount) as total_amount\n" +
"from\n" +
" dw_sales t1\n" +
"inner join dim_region t2\n" +
"on t1.regionid = t2.regionid\n" +
"inner join dim_product t3\n" +
"on t1.productid = t3.productid\n" +
"group by\n" +
" t1.date1,\n" +
" t2.regionid,\n" +
" t2.regionname,\n" +
" t3.productid,\n" +
" t3.productname";
ResultSet resultSet = statement.executeQuery(sql);
// 4、打印ResultSet
while(resultSet.next()) {
// 4.1 获取时间
String date1 = resultSet.getString("date1");
// 4.2 获取区域名称
String regionname = resultSet.getString("regionname");
// 4.3 获取产品名称
String productname = resultSet.getString("productname");
// 4.4 总金额
String total_money = resultSet.getString("total_money");
// 4.5 总数量
String total_amount = resultSet.getString("total_amount");
System.out.println(date1 + " " + regionname + " " + productname + " " + total_money + " " + total_amount);
}
connection.close();
}