大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

Hadoop(已更完)

HDFS(已更完)

MapReduce(已更完)

Hive(已更完)

Flume(已更完)

Sqoop(已更完)

Zookeeper(已更完)

HBase(已更完)

Redis (已更完)

Kafka(已更完)

Spark(已更完)

Flink(已更完)

ClickHouse(已更完)

Kudu(已更完)

Druid(已更完)

Kylin(正在更新…)

章节内容

上节我们完成了如下的内容:


手动合并 Segment

案例 1 Kylin 策略

案例 2 自动合并

JDBC 连接 Kylin

1c49c3a273dce23defba70d921e1a8bf_7d5b516ab5ce4dcb893ca6a2af7f2c96.png Cuboid剪枝优化

Cuboid 特指 Kylin 中在某一种维度组合下所计算的所有数据,以减少Cuboid数量为目的的优化统称为Cuboid剪枝。

在没有采取任何优化措施的情况下,Kylin会对每一种维度的组合进行预计算。


如果有4个维度,可能最终会有 2^4 = 16个 Cuboid需要计算

如果有10个维度,那么没有经过任何优化的Cube就存在2^10 = 1024个Cuboid

如果有20个维度,那么Cube中总共会存在2^20 = 1048576个Cuboid

过多的Cuboid数量对构建引擎、存储引擎压力是非常巨大的,因此,在构建维度数量较多的Cube时候,尤其要注意Cube的剪枝优化。

Cube的剪枝优化是一种试图减少额外空间占用的方法,这种方法的前提是不会明显影响查询时间,在做剪枝优化的时候:


需要选择跳过那些多余的Cuboid

有的Cuboid因为查询样式的原因永远不会被查询到,因此显得多余

有的Cuboid的能力和其他Cuboid接近,因此显得多余

Kylin提供了一系列简单的工具来帮助他们完成Cube的剪枝优化。


检查Cuboid数量

ApacheKylin 提供了一个简单的工具,检查Cube中哪些Cuboid最终被预计算了,称这些Cuboid被物化的Cuboid,该工具还能给出每个Cuboid所占空间的估计值。由于该工具需要在对数据进行一定阶段的处理之后才能估算Cuboid的大小,一般来说在Cube构建完毕之后再使用该工具。

使用如下的命令行工具去检查这个Cube中的Cuboid状态:


# 我要查看 wzk_kylin_test_cube_4
kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader wzk_kylin_test_cube_4

执行之后的结果如下图所示:

具体的Cube信息如下所示:

Cube statistics hll precision: 14
Total cuboids: 15
Total estimated rows: 213
Total estimated size(MB): 0.002885580062866211
Sampling percentage:  100
Mapper overlap ratio: 1.0
Mapper number: 1
Length of dimension WZK_KYLIN.DW_SALES1.DT is 1
Length of dimension WZK_KYLIN.DW_SALES1.PRODUCTID is 1
Length of dimension WZK_KYLIN.DW_SALES1.CHANNELID is 1
Length of dimension WZK_KYLIN.DW_SALES1.REGIONID is 1
|---- Cuboid 1111, est row: 47, est MB: 0
    |---- Cuboid 0111, est row: 47, est MB: 0, shrink: 100%
        |---- Cuboid 0011, est row: 16, est MB: 0, shrink: 34.04%
            |---- Cuboid 0001, est row: 4, est MB: 0, shrink: 25%
            |---- Cuboid 0010, est row: 4, est MB: 0, shrink: 25%
        |---- Cuboid 0101, est row: 15, est MB: 0, shrink: 31.91%
            |---- Cuboid 0100, est row: 4, est MB: 0, shrink: 26.67%
        |---- Cuboid 0110, est row: 16, est MB: 0, shrink: 34.04%
    |---- Cuboid 1011, est row: 16, est MB: 0, shrink: 34.04%
        |---- Cuboid 1001, est row: 4, est MB: 0, shrink: 25%
            |---- Cuboid 1000, est row: 1, est MB: 0, shrink: 25%
        |---- Cuboid 1010, est row: 4, est MB: 0, shrink: 25%
    |---- Cuboid 1101, est row: 15, est MB: 0, shrink: 31.91%
        |---- Cuboid 1100, est row: 4, est MB: 0, shrink: 26.67%
    |---- Cuboid 1110, est row: 16, est MB: 0, shrink: 34.04%
----------------------------------------------------------------------------
============================================================================
Statistics of wzk_kylin_test_cube_4[20240102000000_20240104000000]

Cube statistics hll precision: 14
Total cuboids: 15
Total estimated rows: 160
Total estimated size(MB): 0.00215911865234375
Sampling percentage:  100
Mapper overlap ratio: 0.0
Mapper number: 0
Length of dimension WZK_KYLIN.DW_SALES1.DT is 1
Length of dimension WZK_KYLIN.DW_SALES1.PRODUCTID is 1
Length of dimension WZK_KYLIN.DW_SALES1.CHANNELID is 1
Length of dimension WZK_KYLIN.DW_SALES1.REGIONID is 1
|---- Cuboid 1111, est row: 22, est MB: 0
    |---- Cuboid 0111, est row: 21, est MB: 0, shrink: 95.45%
        |---- Cuboid 0011, est row: 12, est MB: 0, shrink: 57.14%
            |---- Cuboid 0001, est row: 4, est MB: 0, shrink: 33.33%
            |---- Cuboid 0010, est row: 4, est MB: 0, shrink: 33.33%
        |---- Cuboid 0101, est row: 13, est MB: 0, shrink: 61.9%
            |---- Cuboid 0100, est row: 4, est MB: 0, shrink: 30.77%
        |---- Cuboid 0110, est row: 13, est MB: 0, shrink: 61.9%
    |---- Cuboid 1011, est row: 14, est MB: 0, shrink: 63.64%
        |---- Cuboid 1001, est row: 6, est MB: 0, shrink: 42.86%
            |---- Cuboid 1000, est row: 2, est MB: 0, shrink: 33.33%
        |---- Cuboid 1010, est row: 7, est MB: 0, shrink: 50%
    |---- Cuboid 1101, est row: 16, est MB: 0, shrink: 72.73%
        |---- Cuboid 1100, est row: 7, est MB: 0, shrink: 43.75%
    |---- Cuboid 1110, est row: 15, est MB: 0, shrink: 68.18%

对应的截图如下图:

估计Cuboid大小的精度(HII Precision)

总共的Cuboid数量

Segment 的总行数估计

Segment的大小估计,Segment的大小决定Mapper、Reducer的数量、数据分片数量等

所有的Cuboid及它的分析结果都以树状的形式打印了出来

在这颗树上,每个节点代表一个Cuboid,每个Cuboid都由一连串1和0的数字组成

数字串的长度等于有效维护度的数量,从左到右每个数字依次代表RowKeys设置中的各个维度,如果数字为0,则代表这个Cuboid中不存在相应的维度,如果数字为1,则代表这个Cuboid中存在相应的维度

除了最顶端的Cuboid之外,每个Cuboid都有一个父亲Cuboid,且都比父亲Cuboid少了一个“1”,其意义是这个Cuboid就是由它的父亲节点减少一个维度聚合而来的(上卷)

最顶端的Cuboid成为Base Cuboid,它直接由源数据计算而来,Base Cuboid的具体信息,包括该Cuboid的输出中除了0和1的数字串以外,后面还有每个Cuboid的具体信息,包括该Cuboid行数的估计值、该Cuboid大小的估计值,以及这个Cuboid的行数与父亲节点的对比(Shrink值)

所有Cuboid行数的估计值之和应该等于Segment的行数估计值,所有Cuboid的大小估计值应该等于该Segment的大小估计值,每个Cuboid都是在它的父亲节点的基础上进一步聚合而成的

检查Cube大小

在WebGUI的Model页面选择一个READ状态为Cube,光标移动到该Cube的CubeSize列时,WebGUI会提示Cube的源数据大小,以及当前Cube的大小除以数据源大小的比例,称为膨胀率(Expansion Rate)。


我们可以在页面上看到Cube的大小信息,如下图所示:

991037faeec687d40b84394b2e573811_d9c2627087c5442ab822881409829001.png 一般来说,Cube的膨胀率应该在0%-1000%之间,如果一个Cube的膨胀率超过1000%,那么应该查找当中的原因,膨胀率高可能有以下几个方面的原因:


Cube中的维度数量较多,且没有进行很好的Cuboid剪枝优化,导致Cuboid数量极多

Cube中存在较高基数的维度(基数的维度是指维度中有多少个不同的值),导致包含这类维度的每个Cuboid占用的空间都很大,这些Cuboid累积造成整体Cube体积变大。

存在占用空间大的度量,例如Count Distinct,因此需要Cuboid的每一行中都为其保存了一个较大度量数据,最坏的情况会导致Cuboid中每一行都有数十KB,从而造成整个Cube的体积变大

对于Cube的膨胀率居高不下的情况,需要结合实际数据进行分析,优化。


使用衍生维度

一个维度可以是普通维度或者衍生维度(Derived)

将维度表的维度设置为衍生维度,这个维度不会参与计算,而是使用维度表的主键(或事实表的外键)来替代它。

Kylin会在底层记录维表主键与其他维度之间的映射关系,以便在查询时能够动态的将维度表的主键翻译成这些非主键维度,并进行实时聚合。

创建Cube的时候,这些维度如果指定为衍生维度,Kylin将会排除这些维度,而是使用维度表的主键来代替它们创建Cuboid,后续查询的时候,再基于主键的聚合结果,在进行一次聚合。

使用衍生角度会有效减少Cube中的Cuboid数量,但在查询的时候会增加聚合的时间。


不适合的场景:


如果从维度表主键到某个维度表所需要的聚合工作量非常大,此时作为一个普通的维度表聚合更合适,否则会影响Kylin的查询性能。

案例1-定义衍生维度及对比

基本介绍

有以下时间日期维表:

编写 SQL

-- 建表
drop table wzk_kylin.dim_date;
create table wzk_kylin.dim_date(
dateid string,
dayofyear string,
dayofmonth string,
day_in_year string,
day_in_month string,
weekday string,
week_in_month string,
week_in_year string,
date_type string,
quarter string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 加载数据
LOAD DATA LOCAL INPATH 'dim_date.txt' OVERWRITE
INTO TABLE wzk_kylin.dim_date;

备注信息:

日期维度代表 dim_date中两个字段,dayofyear、dayofmonth、不能是year、month。

测试数据

dim_date里,少放几条数据(机器太弱了跑不动):


2024-01-01,2024,01,001,01,1,1,01,workday,Q1
2024-01-02,2024,01,002,02,2,1,01,workday,Q1
2024-01-03,2024,01,003,03,3,1,01,workday,Q1
2024-01-04,2024,01,004,04,4,1,01,workday,Q1

上传数据

cd /opt/wzk/kylin_test
vim dim_date.txt

写入如下的数据:

cd /opt/wzk/kylin_test
vim dim_date.sql

写入的数据如下图所示:

执行如下的脚本:

cd /opt/wzk/kylin_test
hive -f dim_date.sql
• 1
• 2

执行结果如下图所示:

Cube设计

对应的SQL:


select dim_date.dayofyear, sum(price)
from lagou_kylin.dw_sales join lagou_kylin.dim_date on
  dw_sales.date1 = dim_date.dateid
group by dim_date.dayofyear;

基本的执行流程如:

创建项目 - 指定数据源 - 定义Model- 定义Cube - 查询

加载数据源

之前已经操作过很多次了,这里就简单一些写了,添加日期维度表:

创建Model,wzk_test_model_5,选择如下的连表关系:

维度按照按照如下图的配置进行:

度量还是按原来的:

剩下的部分默认即可。

构建Cube

我们分别构建刚才创建的两个Cube:

构建结果

构建的结果如下图所示:

wzk_test_kylin_cube_5

wzk_test_kylin_cube_5_2

检查Cube的Cuboid数量

我们刚才创建了两个Cube如下图所示:

wzk_test_kylin_cube_5

查看 wzk_test_kylin_cube_5:


kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader wzk_kylin_test_cube_5


查询结构如下:

============================================================================
Statistics of wzk_kylin_test_cube_5[FULL_BUILD]

Cube statistics hll precision: 14
Total cuboids: 2047
Total estimated rows: 7999
Total estimated size(MB): 0.03921151161193848
Sampling percentage:  100
Mapper overlap ratio: 1.0
Mapper number: 1
Length of dimension WZK_KYLIN.DW_SALES.DATE1 is 1
Length of dimension WZK_KYLIN.DIM_DATE.DATEID is 1
Length of dimension WZK_KYLIN.DIM_DATE.DAYOFYEAR is 1
Length of dimension WZK_KYLIN.DIM_DATE.DAYOFMONTH is 1
Length of dimension WZK_KYLIN.DIM_DATE.DAY_IN_YEAR is 1
Length of dimension WZK_KYLIN.DIM_DATE.DAY_IN_MONTH is 1
Length of dimension WZK_KYLIN.DIM_DATE.WEEKDAY is 1
Length of dimension WZK_KYLIN.DIM_DATE.WEEK_IN_MONTH is 1
Length of dimension WZK_KYLIN.DIM_DATE.WEEK_IN_YEAR is 1
Length of dimension WZK_KYLIN.DIM_DATE.DATE_TYPE is 1
Length of dimension WZK_KYLIN.DIM_DATE.QUARTER is 1
|---- Cuboid 11111111111, est row: 4, est MB: 0
    |---- Cuboid 00110001111, est row: 1, est MB: 0, shrink: 25%
----------------------------------------------------------------------------
2024-08-10 16:46:06,454 INFO  [close-hbase-conn] hbase.HBaseConnection:137 : Closing HBase connections...
2024-08-10 16:46:06,454 INFO  [close-hbase-conn] client.ConnectionManager$HConnectionImplementation:2155 : Closing master protocol: MasterService
2024-08-10 16:46:06,456 INFO  [close-hbase-conn] client.ConnectionManager$HConnectionImplementation:1712 : Closing zookeeper sessionid=0x200dd291db1003c
2024-08-10 16:46:06,467 INFO  [main-EventThread] zookeeper.ClientCnxn:512 : EventThread shut down
2024-08-10 16:46:06,467 INFO  [close-hbase-conn] zookeeper.ZooKeeper:684 : Session: 0x200dd291db1003c closed
root@h122:~# 

对应的截图如下所示:

wzk_test_kylin_cube_5_2

查看 wzk_test_kylin_cube_5_2:


kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader wzk_test_kylin_cube_5_2


查询结果如下:


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
24天前
|
消息中间件 监控 大数据
优化Apache Kafka性能:最佳实践与调优策略
【10月更文挑战第24天】作为一名已经对Apache Kafka有所了解并有实际使用经验的开发者,我深知在大数据处理和实时数据流传输中,Kafka的重要性不言而喻。然而,在面对日益增长的数据量和业务需求时,如何保证系统的高性能和稳定性成为了摆在我们面前的一个挑战。本文将从我的个人视角出发,分享一些关于如何通过合理的配置和调优来提高Kafka性能的经验和建议。
61 4
|
1月前
|
消息中间件 分布式计算 大数据
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
66 5
|
19天前
|
存储 大数据
究竟什么是大数据,大数据具体应该怎么定义
【10月更文挑战第29天】大数据是指那些传统资料处理技术无法应对的海量数字信息,包括文本、音视频、电子邮件等多类型数据。它涉及数据的获取、分析、存储与传输,需借助专门的技术手段。大数据分析能够帮助企业洞察消费者行为、预测市场趋势,从而实现业务增长。随着数字化进程加快,高效管理与利用大数据成为企业面临的重大挑战。
60 2
|
21天前
|
数据采集 大数据 数据安全/隐私保护
大数据列表删除的定义
【10月更文挑战第23天】
27 1
|
1月前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
39 1
|
1月前
|
分布式计算 大数据 Linux
大数据体系知识学习(二):WordCount案例实现及错误总结
这篇文章介绍了如何使用PySpark进行WordCount操作,包括环境配置、代码实现、运行结果和遇到的错误。作者在运行过程中遇到了Py4JJavaError和JAVA_HOME未设置的问题,并通过导入findspark初始化和设置环境变量解决了这些问题。文章还讨论了groupByKey和reduceByKey的区别。
30 1
|
1月前
|
存储 大数据 分布式数据库
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
35 1
|
1月前
|
存储 机器学习/深度学习 分布式计算
大数据技术——解锁数据的力量,引领未来趋势
【10月更文挑战第5天】大数据技术——解锁数据的力量,引领未来趋势
|
9天前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
78 7
|
9天前
|
存储 分布式计算 大数据
大数据 优化数据读取
【11月更文挑战第4天】
23 2

推荐镜像

更多