KYLIN 建模设计学习总结(概念、空间优化、查询性能优化)

简介: KYLIN 建模设计学习总结(概念、空间优化、查询性能优化)

KYLIN 建模设计学习总结

昨日Kyligence的老师对kylin建模进行了培训,基于Kyligence Cloud,除了界面以及商业特性,其他方式与开源版apache kylin 基本相同。

模型(model

模型是一个语意层的设计,在数仓之上,各种BI工具之下。构建一个模型需要一张事实表,可以有多张维度表,并通过列进行inner\left join。

模型中的维度、度量,基本可以理解为描述事物的角度(地区、客户号),以及指标(身高、销量)。用来对应一种场景下的所有查询的可能性。

  • 维度是从模型选取的表中的字段中部分选取、或全部选取。
  • 度量是在表中字段选取的基础上,进行一定的聚合计算,例如sum、count、去重、top N.
  • 可计算列是一种中间能力,处理底层数据未开发的,或者说不想修改历史设计时使用的,可以利用如case when 进行码值映射、区分范围的虚拟字段,在数仓中并不存在,但可给BI进行查询。

模型中对于维度字段的基数,释义大致是对于该字段的不重复值的数量(distinc count),其会影响构建聚合组时的膨胀率(预计算存储空间相对于原始数据的比例),当基数超过百万、甚至千万时,其对存储空间的影响会开始变得很大。

聚合组

聚合组相对于开源版本kylin应当是cube的概念。新增聚合组时,是从模型的维度中进行选取聚合组的纬度,并默认

对应n个维度产生

个索引(网上资料往往会说减一,实际上C n取n的索引也是存在的,就是其本身)。KYLIN为了减少对空间的浪费,默认配置中限制了一个聚合组索引上限为1000条,所以,达到10个维度就必须进行剪枝,否则会限制聚合组保存。【索引数在1000以内时,所需的存储空间基本处于线性增长,超过后会呈几何级增长】。

  • 必需维度
    必需维度即每次查询中必然包含的维度,例如会计日期这样的字段 。勾选一个维度后,会使得不包含该维度的索引,以及该维度本身的一维索引不会再去生成。是一种结合业务的最有效的剪枝方式。有效降低膨胀率。
  • 层级维度
    顾名思义,选中的维度存在层级关系,下层的维度存在时,上层维度必然存在,例如年-月这样的字段。这样勾选后,就会将包含“月”字段,但是未包含“年”字段的索引从组合中删除,完成剪枝。
    另外,万一存在查询层级维度断开的情况,比如查年-月-日这样的层级维度时,突然业务想要查一下今年每个月的第一天的销量,条件就为年-日,这种情况,由于当前聚合组中,一个维度只能使用一次,这个条件的查询如果真的有必要,就去新建一个聚合组,对其建立一个联合维度。
  • 联合维度
    联合维度字面意思就是将这两个维度绑在一起,可以理解为一个联合维度中的维度往往在查询时会一起被查询到,不需要对单独维度列进行优化。联合维度与其他两个维度不同,它没有强业务关联,在使用必需维度、层级维度后,仍超过索引上限时,可以有一个利用数据特征的暴力优化的方式,将基数不大,看起来甚至也没有多少关联意义的维度进行组合,以此来减少索引数。(不要引入高基维)

另外,聚合组还有个设置:

  • 最大维度组合数
    该值会限制进行组合产生索引的维度数的上线,例如设置为5,就不会产生维度在5个以上的维度组合产生的索引。

这种情况下生成的索引数会有很多,但是可能并不是所有的索引都是我们需要的,我们可以在生成后,单独对某一条索引进行删除。在生产运行一段时间后(按月为单位查看),可以对没有命中过的索引、命中次数少且消耗空间大(性价比低)的索引进行删除(这种情况它会命中比其少维度的父索引,并不会直接下压)。

其实,在挺多业务场景下,很少会基于一个维度、两个维度进行筛选查询,有些企业会通过调用kylin rest api进行定时扫描、删除。

查询优化

在聚合组的总结中,我有意仅写了关于如何在建立聚合组时如何减少存储空间的消耗,而实际上,用户关心的是查询的速度。那你可能要问了,建立聚合组索引,不就是用来预计算提高查询速度的吗? 关于这点,我们可以类比以下普通的关系型数据库的索引。

  • 区分度大的字段应该在索引中排在前,同样的基数大的维度,也应当排在前列。高频查询的字段,也应该往前挪动。
  • 分片(shardBy)
    kylin将预计算数据存在hbase上,底层也是一个hdfs文件,出厂默认一个文件分片的大小为256M。在不设置分片列时,查询的小文件数多,可以去并发读取,当然这基于spark集群资源充裕时,查询速度是提升的,往往,老板也没那么大气。设置一个分片列,能有效去减少读取磁盘文件的次数,分片列建议设置为高频的筛选条件,当然,业务不明的情况下,暴力使用基数最大的列也是可取的(当然,我们要尽量保证数据不倾斜)。
    建议切片完成后,文件数量在200-300个,资源充足可以300-500个,使得扫描文件在两轮中可以完成。(曾经生产环境在读写分离前,资源抢占不到,一直没有去读取文件,导致查询缓慢,甚至麒麟返回超时、socket连接断开)。

明细索引

当前在企业版4.2、4.3中其效率并不高,方法论也和上面聚合组相似。期待其在v4.5接入clickhourse之后的提升了。

目录
相关文章
|
7月前
|
存储 消息中间件 并行计算
流计算中的性能优化有哪些方法?请举例说明。
流计算中的性能优化有哪些方法?请举例说明。
71 0
|
1月前
|
数据库 数据库管理 索引
索引在提高查询性能方面的优势体现在哪些方面?
索引在提高查询性能方面具有多方面的显著优势
|
23天前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
57 4
|
5月前
|
SQL 安全 Java
探索软件测试的多维策略:从单元到集成,再到性能与安全
在软件开发生命周期中,测试是不可或缺的一环。本文将深入探讨软件测试的多维策略,从单元测试、集成测试到性能测试和安全测试等各个层面进行剖析。我们将通过具体的统计数据和案例分析,揭示不同测试策略的优势和应用场景。文章旨在为读者提供一个全面的测试框架,帮助他们构建更稳定、高效和安全的系统。
104 2
|
2月前
|
数据采集 自然语言处理 算法
|
7月前
|
存储 并行计算 算法
【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(性能三大定律)
【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(性能三大定律)
89 0
|
5月前
|
存储 SQL 运维
MSSQL性能调优精要:索引深度优化、查询高效重构与并发精细控制
在MSSQL数据库的运维与优化领域,性能调优是一项复杂而细致的工作,直接关系到数据库的稳定性和响应速度
|
5月前
|
SQL 运维 监控
MSSQL性能调优实战:索引精细化构建、SQL查询深度优化与高效并发控制策略
在Microsoft SQL Server(MSSQL)的运维与优化过程中,索引的精细化构建、SQL查询的深度优化以及高效并发控制策略是提升数据库性能的关键
|
5月前
|
SQL 监控 Serverless
MSSQL性能调优实战:索引精细化构建、SQL查询深度优化与并发管理策略
在Microsoft SQL Server(MSSQL)的性能调优实践中,索引的精细化构建、SQL查询的深度优化以及高效的并发管理策略是提升数据库性能不可或缺的三大支柱
|
5月前
|
SQL 运维 监控
MSSQL性能调优深度解析:索引精细管理、SQL查询优化技巧与高效并发控制
在Microsoft SQL Server(MSSQL)的运维与性能调优过程中,针对索引、SQL查询和并发控制的有效管理是提高数据库性能和稳定性的关键