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

目录
相关文章
|
JavaScript
Vue中侦听器watch时,调用this时出现undefined问题
Vue中侦听器watch时,调用this时出现undefined问题
505 0
Vue中侦听器watch时,调用this时出现undefined问题
|
前端开发
react-grapesjs——开源代码学习与修改(初出茅庐)(一)
react-grapesjs——开源代码学习与修改(初出茅庐)
340 0
|
SQL 消息中间件 存储
Flink报错问题之Flink报错:Table sink 'a' doesn't support consuming update and delete changes which is produced by node如何解决
Flink报错通常是指在使用Apache Flink进行实时数据处理时遇到的错误和异常情况;本合集致力于收集Flink运行中的报错信息和解决策略,以便开发者及时排查和修复问题,优化Flink作业的稳定性。
|
8月前
|
人工智能 API 决策智能
还在蹲Manus的邀请码?别等了!开源版Manus为你快速创建AI工位,给AI一台电脑,然后你就玩去吧!
OpenManus 是 MetaGPT 的开源 AI 平台,支持多语言模型和工具链,执行代码、处理文件等任务,具备实时反馈。OWL 基于 CAMEL-AI,支持角色分配、任务分解和记忆功能,实现高效任务自动化。
1069 22
还在蹲Manus的邀请码?别等了!开源版Manus为你快速创建AI工位,给AI一台电脑,然后你就玩去吧!
|
9月前
|
存储 人工智能 搜索推荐
HealthGPT:你的AI医疗助手上线了:支持X光到病理切片,诊断建议+报告生成全自动
HealthGPT 是浙江大学联合阿里巴巴等机构开发的先进医学视觉语言模型,具备医学图像分析、诊断辅助和个性化治疗方案建议等功能。
1098 5
HealthGPT:你的AI医疗助手上线了:支持X光到病理切片,诊断建议+报告生成全自动
|
8月前
|
人工智能 自然语言处理 小程序
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
2388 11
技术小白如何利用DeepSeek半小时开发微信小程序?
|
11月前
|
人工智能 文字识别 并行计算
行业实践 | 基于Qwen2-VL实现医疗表单结构化输出
本项目针对不同医院检查报告单样式差异大、手机拍摄质量差等问题,传统OCR识别效果不佳的情况,探索并选定了Qwen2-vl系列视觉语言模型。通过微调和优化,模型在识别准确率上显著提升,能够精准识别并结构化输出报告单信息,支持整张报告单及特定项目的识别。系统采用FastAPI封装接口,Gradio构建展示界面,具备高效、灵活的应用特性。未来该方案可扩展至多种文本识别场景,助力行业数字化转型。
893 20
|
存储 监控 数据挖掘
Kylin使用心得与实战经验分享
本文详细介绍了Apache Kylin的使用方法及其在大数据分析中的优势。首先,Kylin是一款基于Hadoop和Spark的开源分布式分析引擎,通过预计算技术实现亚秒级的交互式查询响应,大幅提高数据分析效率。接着,文章阐述了Kylin的核心特点,包括高效多维分析能力和预计算与实时查询的平衡。然后,详细说明了环境搭建、配置步骤及示例代码,展示了如何配置HBase存储后端。在数据建模与优化部分,讲解了星型模型和雪花模型的选择,以及分区策略和索引优化技巧。
|
Java Android开发
IDEA设置项目编码格式【修改为GBK 或 UTF-8】
这篇文章介绍了在IntelliJ IDEA中如何设置项目编码格式,包括将项目编码修改为GBK或UTF-8的详细步骤和图解。
20277 12
IDEA设置项目编码格式【修改为GBK 或 UTF-8】