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

本文涉及的产品
云原生网关 MSE Higress,422元/月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 大数据-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 
目录
相关文章
|
2月前
|
存储 分布式计算 大数据
大数据 优化数据读取
【11月更文挑战第4天】
59 2
|
2月前
|
消息中间件 监控 大数据
优化Apache Kafka性能:最佳实践与调优策略
【10月更文挑战第24天】作为一名已经对Apache Kafka有所了解并有实际使用经验的开发者,我深知在大数据处理和实时数据流传输中,Kafka的重要性不言而喻。然而,在面对日益增长的数据量和业务需求时,如何保证系统的高性能和稳定性成为了摆在我们面前的一个挑战。本文将从我的个人视角出发,分享一些关于如何通过合理的配置和调优来提高Kafka性能的经验和建议。
96 4
|
2月前
|
存储 算法 固态存储
大数据分区优化存储成本
大数据分区优化存储成本
38 4
|
2月前
|
存储 大数据 Serverless
大数据增加分区优化资源使用
大数据增加分区优化资源使用
38 1
|
2月前
|
监控 Cloud Native BI
8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
飞轮科技正式推出 Apache Doris 和 SelectDB 精选案例集 ——《走向现代化的数据仓库(2024 版)》,汇聚了来自各行各业的成功案例与实践经验。该书以行业为划分标准,辅以使用场景标签,旨在为读者提供一个高度整合、全面涵盖、分类清晰且易于查阅的学习资源库。
|
2月前
|
存储 NoSQL 大数据
大数据 数据存储优化
【10月更文挑战第25天】
95 2
|
3月前
|
分布式计算 大数据 Linux
大数据体系知识学习(二):WordCount案例实现及错误总结
这篇文章介绍了如何使用PySpark进行WordCount操作,包括环境配置、代码实现、运行结果和遇到的错误。作者在运行过程中遇到了Py4JJavaError和JAVA_HOME未设置的问题,并通过导入findspark初始化和设置环境变量解决了这些问题。文章还讨论了groupByKey和reduceByKey的区别。
47 1
|
3月前
|
存储 大数据 分布式数据库
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
52 1
|
22天前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
310 33
The Past, Present and Future of Apache Flink
|
3月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
882 13
Apache Flink 2.0-preview released

推荐镜像

更多