Kylin Cube优化[内含优化案例]

本文详细介绍了在大数据分析工具Kylin中,如何使用JDBC连接操作Cube,并着重讨论了Cuboid剪枝优化的重要性。通过实例展示了未优化与优化后的Cuboid数量和大小对比,强调了衍生维度和聚合组在优化中的作用,旨在帮助初学者理解并优化大数据Cube的构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,欢迎来到本篇博客,博主是一名刚入大数据行业的小白,利用空闲的时间来分享自己所学的知识,帮助和博主一样刚处于起步阶段的同学,水平不高,若有什么错误和纰漏之处恳请大佬不吝赐教,目前个人博客只有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价格
O000111000
O000212000
O000333000
O000444000
O000554000
O000663000

问题:

  • 生成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
    在这里插入图片描述

小结

--------
感谢大家的支持,若有什么不正确的地方还请大家能及时的反馈,记得点赞收藏支持一下!在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43563705

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值