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之后的提升了。

目录
相关文章
|
4月前
|
存储 消息中间件 并行计算
流计算中的性能优化有哪些方法?请举例说明。
流计算中的性能优化有哪些方法?请举例说明。
22 0
|
2月前
|
存储 并行计算 算法
【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(性能三大定律)
【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(性能三大定律)
42 0
|
2月前
|
存储 缓存 安全
【C/C++ 项目优化实战】 分享几种基础且高效的策略优化和提升代码性能
【C/C++ 项目优化实战】 分享几种基础且高效的策略优化和提升代码性能
70 0
|
8月前
|
消息中间件 缓存 NoSQL
程序员快来学习缓存层场景实战数据收集—技术选型思路及整体方案
根据以上业务场景,项目组提炼出了6点业务需求,并针对业务需求梳理了技术选型相关思路。 1)原始数据海量:对于这一点,初步考虑使用HBase进行持久化。 2)对于埋点记录的请求响应要快:埋点记录服务会把原始埋点记录存放在一个缓存层,以此保证响应快速。关于这一点有多个缓存方案,稍后展开讨论。 3)可通过后台查询原始数据:如果直接使用HBase作为查询引擎,查询速度太慢,所以还需要使用Elasticsearch来保存查询页面上作为查询条件的字段和活动ID。
|
11月前
|
SQL 存储 缓存
我们常说的数据库优化,可以从哪些维度入手?
我们常说的数据库优化,可以从哪些维度入手?
102 0
|
存储 消息中间件 Kubernetes
高效稳定的通用增量 Checkpoint 详解之二:性能分析评估
本文将从理论和实验两个部分详细论述通用增量 Checkpoint 的收益与开销,并分析其适用场景。
高效稳定的通用增量 Checkpoint 详解之二:性能分析评估
|
JSON 前端开发 JavaScript
优化封装方案分析| 学习笔记
快速学习优化封装方案分析。
64 0
|
缓存 负载均衡 NoSQL
接口性能优化方案及其理论依据
我们现在接口的线上问题主要有三个,第一:启动时有些机器会有短暂的线程池满。第二:并发量上不去,怕服务被打死,不敢调高限流阈值。第三:499超时现象。   今天终于把那天说的全量执行时间延长,从图中可以看到,中午12点发版之后,内存使用率有明显下降,晚上是接口调用高峰,会有上浮,但是总体来看还是下降了。
接口性能优化方案及其理论依据
|
存储 人工智能 缓存
性能优化的本质
资源与时间的兑换 cache 空间资源与时间的兑换-- 提前计算,cache结果-- cache到内存中, 更快的内存空间换取时间-- 数据库设计中的反规范化设计, 通过增加冗余字段,减少子查询 -- 空间换取时间-- 网页中的静态化cache, 动态网页生成结果cache -- 空间换取时间集群,读写分离,主从库等.
1260 0
|
算法 程序员
软件优化的原理与实践系列之一向量化计算
向量化计算 软件优化的原理与实践系列之一 前言 用过MATLAB仿真语言的同学,都有这样的经验。要尽量多用向量化运算,而不要自己手写循环语句,否则代码的执行效率会相当低下。如果你熟悉python,涉及到数值计算的时候,也要尽量的调用成熟的数值计算的库,比如numpy,而不是自己用循环去实现。一个众所周知的理由是,别人成熟的库已经经过了高度的优化,我们没有必要重复造轮子。 事实上,还有另外一
1362 0