大家好,欢迎来到本篇博客,博主是一名刚入大数据行业的小白,利用空闲的时间来分享自己所学的知识,帮助和博主一样刚处于起步阶段的同学,水平不高,若有什么错误和纰漏之处恳请大佬不吝赐教,目前个人博客只有CSDN:
https://zhenyu.blog.csdn.net/
,感谢大家的支持,谢谢
送给大家一句话:今日事,今日毕本篇博客主要讲解:使用JDBC连接操作Kylin
Cuboid剪枝优化
为什么要进行Cuboid剪枝剪枝优化
将以减少Cuboid数量为目的的Cuboid优化统称为Cuboid剪枝。在没有采取任何优化措施的情况下,Kylin会对每一种维度的组合进行预计算,每种维度的组合的预计算结果被称为Cuboid。
- 如果有4个维度,可能最终会有2^4 =16个Cuboid需要计算。但在实际开发中,用户的维度数量一般远远大于4个。
- 如果有10个维度,那么没有经过任何优化的Cube就会存在2^10 =1024个Cuboid
- 如果有20个维度,那么Cube中总共会存在2^20 =104 8576个Cuboid
这样的Cuboid的数量就足以让人想象到这样的Cube对构建引擎、存储引擎压力非常巨大。因此,在构建维度数量较多的Cube时,尤其要注意Cube的剪枝优化
Cube的剪枝优化是一种试图减少额外空间占用的方法,这种方法的前提是不会明显影响查询时间。在做剪枝优化的时候
- 需要选择跳过那些“多余”的Cuboid
- 有的Cuboid因为查询样式的原因永远不会被查询到,因此显得多余
- 有的Cuboid的能力和其他Cuboid接近,因此显得多余
Kylin提供了一系列简单的工具来帮助他们完成Cube的剪枝优化
检查Cuboid数量
Apache Kylin提供了一个简单的工具,检查Cube中哪些Cuboid最终被预计算了,称这些Cuboid为被物化的Cuboid,该工具还能给出每个Cuboid所占空间的估计值。由于该工具需要在对数据进行一定阶段的处理之后才能估算Cuboid的大小,因此一般来说只能在Cube构建完毕之后再使用该工具。
使用如下的命令行工具去检查这个Cube中的Cuboid状态:
bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader CUBE_NAME
# CUBE_NAME 想要查看的Cube的名字
示例:
bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader cube_order
============================================================================
Statistics of cube_order[20191011000000_20191015000000]
Cube statistics hll precision: 14
Total cuboids: 3
Total estimated rows: 20
Total estimated size(MB): 1.02996826171875E-4
Sampling percentage: 100
Mapper overlap ratio: 0.0
Mapper number: 0
Length of dimension ITCAST_KYLIN_DW.FACT_ORDER.DT is 1
Length of dimension ITCAST_KYLIN_DW.FACT_ORDER.USER_ID is 1
|---- Cuboid 11, est row: 12, est MB: 0
|---- Cuboid 01, est row: 4, est MB: 0, shrink: 33.33%
|---- Cuboid 10, est row: 4, est MB: 0, shrink: 33.33%
----------------------------------------------------------------------------
输出结果分析:
Cube statistics hll precision: 14
Total cuboids: 3
Total estimated rows: 20
Total estimated size(MB): 1.02996826171875E-4
Sampling percentage: 100
Mapper overlap ratio: 0.0
Mapper number: 0
- 估计Cuboid大小的精度(Hll Precision)
- 总共的Cuboid数量
- Segment的总行数估计
- Segment的大小估计,Segment的大小决定mapper、reducer的数量、数据分片数量等
|---- Cuboid 11, est row: 12, est MB: 0
|---- Cuboid 01, est row: 4, est MB: 0, shrink: 33.33%
|---- Cuboid 10, est row: 4, est MB: 0, shrink: 33.33%
- 所有的Cuboid及它的分析结果都以树状的形式打印了出来
- 在这棵树中,每个节点代表一个Cuboid,每个Cuboid都由一连串1或0的数字组成
- 数字串的长度等于有效维度的数量,从左到右的每个数字依次代表Rowkeys设置中的各个维度。如果数字为0,则代表这个Cuboid中不存在相应的维度;如果数字为1,则代表这个Cuboid中存在相应的维度
- 除了最顶端的Cuboid之外,每个Cuboid都有一个父亲Cuboid,且都比父亲Cuboid少了一个“1”。其意义是这个Cuboid就是由它的父亲节点减少一个维度聚合而来的(上卷)
- 最顶端的Cuboid称为Base Cuboid,它直接由源数据计算而来。Base Cuboid中包含所有的维度,因此它的数字串中所有的数字均为1
- 每行Cuboid的输出中除了0和1的数字串以外,后面还有每个Cuboid的具体信息,包括该Cuboid行数的估计值、该Cuboid大小的估计值,以及这个Cuboid的行数与父亲节点的对比(Shrink值)
- 所有Cuboid行数的估计值之和应该等于Segment的行数估计值,所有Cuboid的大小估计值应该等于该Segment的大小估计值。每个Cuboid都是在它的父亲节点的基础上进一步聚合而成的
检查Cube大小
在Web GUI的Model页面选择一个READY状态的Cube,当我们把光标移到该Cube的Cube Size列时,Web GUI会提示Cube的源数据大小,以及当前Cube的大小除以源数据大小的比例,称为膨胀率(Expansion Rate)
查看cube大小 |
---|
![]() |
一般来说,Cube的膨胀率应该在0%~1000%之间,如果一个Cube的膨胀率超过1000%,那么应当开始挖掘其中的原因。通常,膨胀率高有以下几个方面的原因:
- Cube中的维度数量较多,且没有进行很好的Cuboid剪枝优化,导致Cuboid数量极多
- Cube中存在较高基数的维度,导致包含这类维度的每一个Cuboid占用的空间都很大,这些Cuboid累积造成整体Cube体积变大
- 存在比较占用空间的度量,例如Count Distinct,因此需要在Cuboid的每一行中都为其保存一个较大度量数据,最坏的情况将会导致Cuboid中每一行都有数十KB,从而造成整个Cube的体积变大。
对于Cube膨胀率居高不下的情况,管理员需要结合实际数据进行分析,优化。
使用衍生维度
示例:
- 有两张表 用户维度表(dim_user)、订单事实表(fact_order),要根据各个维度建立MOLAP立方体
用户维度表(dim_user)
ID | 姓名 | 出生年份 | 政治面貌 | 职业 | 性别 | 民族 | 省份 | 市 | 区 |
---|---|---|---|---|---|---|---|---|---|
1 | 张三 | 1999 | 团员 | 程序员 | 男 | 汉族 | 北京 | 北京市 | 东城区 |
2 | 李四 | 1989 | 党员 | 学生 | 女 | 回族 | 北京 | 北京市 | 昌平区 |
3 | 王五 | 1990 | 党员 | 程序员 | 男 | 汉族 | 北京 | 北京市 | 昌平区 |
4 | 赵六 | 1997 | 党员 | 快递员 | 男 | 傣族 | 上海 | 上海市 | 闵行区 |
订单事实表(fact_order)
订单id | 用户ID | 价格 |
---|---|---|
O0001 | 1 | 1000 |
O0002 | 1 | 2000 |
O0003 | 3 | 3000 |
O0004 | 4 | 4000 |
O0005 | 5 | 4000 |
O0006 | 6 | 3000 |
问题:
- 生成Cube时,如果指定维度表中的:姓名、出生年份、政治面貌、职业、性别、民族、省份、市、区等维度生成Cube,这些维度相互组合,会造成较大的Cube膨胀率
使用衍生维度用于在有效维度内将维度表上的非主键维度排除掉,并使用维度表的主键(其实是事实表上相应的外键)来替代它们。Kylin会在底层记录维度表主键与维度表其他维度之间的映射关系,以便在查询时能够动态地将维度表的主键“翻译”成这些非主键维度,并进行实时聚合。
衍生维度 |
---|
姓名 |
出生年份 |
政治面貌 |
职业 |
性别 |
民族 |
省份 |
市 |
区 |
选择衍生维度 |
---|
![]() |
创建Cube的时候,这些维度如果指定为衍生维度,Kylin将会排除这些维度,而是使用维度表的主键来代替它们创建Cuboid。后续查询的时候,再基于主键的聚合结果,再进行一次聚合。
优化效果:维度表的N个维度组合成的cuboid个数会从2的N次方降为2。
不适用的场景:
- 如果从维度表主键到某个维度表维度所需要的聚合工作量非常大,此时作为一个普通的维度聚合更合适,否则会影响Kylin的查询性能
聚合组
-
聚合组(Aggregation Group)是一种更强大的剪枝工具
-
聚合组假设一个Cube的所有维度均可以根据业务需求划分成若干组
-
同一个组内的维度更可能同时被同一个查询用到,每个分组的维度集合均是Cube所有维度的一个子集
-
不同的分组各自拥有一套维度集合,它们可能与其他分组有相同的维度,也可能没有相同的维度
-
每个分组各自独立地根据自身的规则贡献出一批需要被物化的Cuboid,所有分组贡献的Cuboid的并集就成为了当前Cube中所有需要物化的Cuboid的集合
-
不同的分组有可能会贡献出相同的Cuboid,构建引擎会察觉到这点,并且保证每一个Cuboid无论在多少个分组中出现,它都只会被物化一次
聚合组介绍 |
---|
![]() |
对于每个分组内部的维度,用户可以使用如下三种可选的方式定义它们之间的关系,具体如下:
聚合组设置 |
---|
![]() |
案例
需求:
- 对Cube膨胀率进行调优
准备:
- Sql
-- 创建订单数据库、表结构
create database if not exists `kylin_dw2`;
-- 1. 地理维度表
create table `kylin_dw2`.`dim_address`(
id int,
province string,
city string,
region string
)
row format delimited fields terminated by ',' stored as TEXTFILE;
-- 2. 时间维度表
create table `kylin_dw2`.`dim_date`(
year int,
quarter string,
month int,
day int
)
row format delimited fields terminated by ',' stored as TEXTFILE;
-- 3. 订单数据
create table `kylin_dw2`.`fact_order`(
orderId int,
price int,
province string,
city string,
region string,
year int,
month int,
day int
)
row format delimited fields terminated by ',' stored as TEXTFILE;
-- 加载数据文件
load data local inpath '/hivefile/tykylin/data_address.csv' overwrite into table `kylin_dw2`.`dim_address`;
load data local inpath '/hivefile/tykylin/data_date.csv' overwrite into table `kylin_dw2`.`dim_date`;
load data local inpath '/hivefile/tykylin/data_order.csv' overwrite into table `kylin_dw2`.`fact_order`;
- 文件
链接:https://pan.baidu.com/s/1mC_g3LR5XdN-4c95_Iohyg 提取码:1314
具体步骤:
创建model |
---|
![]() |
指定表关联 |
![]() ![]() |
![]() |
![]() |
指定维度 |
![]() |
指定度量 |
![]() |
MOlde创建完毕 |
![]() |
优化与未优化对比
未优化
创建cube |
---|
![]() |
选择维度 |
![]() |
![]() |
添加度量 |
![]() |
后面直接保存 |
优化
创建Cube |
---|
![]() |
选择维度,全部选择衍生维度 |
![]() |
![]() |
选择度量 |
![]() |
指定聚合组:选择层级维度 |
![]() |
对比结果
大小
cuboid数量
-
优化
bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader optimize_cube
-
未优化
bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader optimize_cube
小结
--------
感谢大家的支持,若有什么不正确的地方还请大家能及时的反馈,记得点赞收藏支持一下!