首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Apache Kylin 1.0中的混合模型

前言

Apache Kylin v1.0引入了一个新的实现“混合模型”(也称为“动态模型”); 这篇文章介绍了这个概念以及如何创建一个混合实例。

遇到的问题

对于传入的SQL查询,Kylin选择一个(并且只有一个)实现来提供查询; 在“混合”之前,只有一种类型的实现向用户开放:Cube。也就是说,只有1个Cube被选中来回答查询;

现在我们来看一个示例案例。假设用户有一个名为“Cube_V1”的多维数据集,它已经建立了几个月; 现在,用户希望添加新的维度或指标以满足其业务需求; 于是他创建了一个名为“Cube_V2”的新立方体;

由于某些原因用户想要保留“Cube_V1”,并且期望从“Cube_V1”的结束日期开始构建“Cube_V2”; 可能的原因包括:

历史源数据已从Hadoop中删除,从一开始就无法构建“Cube_V2”;

立方体很大,重建需要很长时间;

新维度/指标仅在某一天有效或应用;

当查询使用新的维度/指标时,用户感觉过去的结果为空。

对于针对通用维度/指标的查询,用户期望扫描“Cube_V1”和“Cube_V2”以获得完整的结果集; 在这样的背景下,引入“混合模型”来解决这个问题。

混合模型

混合模型是一个新的实现,它是一个或多个其他实现(立方体)的组合; 见下图。

混合模型没有其真正的存储空间; 它就像在表格上的虚拟数据库视图一样; 混合实例充当委托者,将请求转发给其子实现,然后在从实例返回时合并结果。

如何添加混合实例

到目前为止,没有用于创建/编辑混合模型的UI界面; 如果有需要,您需要手动编辑Kylin元数据;

第1步:做一个kylin元数据存储的备份

这将创建一个备份文件夹,假定它是$ KYLIN_HOME / metadata_backup / 2015-09-25 /

第2步:创建子文件夹“hybrid”

第3步:创建混合实例json文件:

像下面这样的输入内容,“名称”和“uuid”需要是唯一的:

这里“Cube_V1”和“Cube_V2”是你想合并的Cube名称。

第4步:将混合实例添加到项目

使用文本编辑器打开项目json文件(例如项目“default”):

在“realizations”数组中,添加一个如下所示的条目,类型需要是“HYBRID”,“实现”是混合实例的名称:

第5步:上传元数据:

请注意,“restore”操作会将元数据从本地上传到远程hbase store,这可能会覆盖远程中的更改; 因此,请在此期间没有从Kylin服务器更改元数据(无 build job,无Cube 创建/更新等)时执行此操作,或者在运行“restore”之前仅将已更改的文件提取到空的本地文件夹。

第6步:重新加载元数据

重新启动Kylin服务器,或在Kylin Web UI的“管理”标签中点击“重新加载元数据”以加载更改; 理想情况下,混合动力车将开始工作; 你可以通过编写一些SQL来做一些验证。

常问问题:

问题1:混合模型何时被调用来回答客户端SQL查询?

如果混合模型中存在一个立方体可以回答查询,则将选择混合体;

问题2:混合模型如何回答一个查询?

Hybrid将把查询委托给它的每个子实现; 如果一个子多维数据集能够执行此查询(匹配所有维度/指标),它会将结果返回到混合模式,否则将被跳过; 最后,查询引擎会在返回给用户之前聚合来自混合的数据;

问题3:混合模型检查日期/时间重复吗?

不检查; 这个需要用户确保混合中的立方体不具有重复的日期/时间范围; 例如,“Cube_V1”在2015-9-20(不含)结束,“Cube_V2”应从2015-9-20(含)开始;

问题4:混合模型会限制具有相同数据模型的子立方体吗?

不会; 为了提供灵活性,Hybrid不检查子立方体的事实表/查找表和连接条件是否相同; 但用户应该明白他们在做什么以避免意外的行为。

问题5:混合模型中是否可以包含子hybrid ?

不能; 没有这个必要; 到目前为止,假设所有的Child都是Cube;

问题6:我可以使用混合加入多个立方体吗?

不能; 混合模型的目的是连接历史Cube和新Cube,类似“union”而不是“join”;

问题7:如果子立方体被禁用,它是否会通过混合动力进行扫描?

不会; 混合实例会在发送查询之前检查子实现的状态; 所以如果立方体被禁用,它将不会被扫描。

清除Hbase无用数据表

当我们对cube执行purge/drop/merge时,一些HBase的表可能会保留在HBase中,而这些表不再被查询,尽管Kylin会做一些自动的垃圾回收,但是它可能不会覆盖所有方面,所以需要我们能够每隔一段时间做一些离线存储的清理工作。具体步骤如下:

1.检查哪些资源需要被清理,这个操作不会删除任何内容:

2.根据上面的输出结果,挑选一两个资源看看是否是不再需要的。接着,在上面的命令基础上添加“–delete true”选项,开始执行清理操作,命令执行完成后,中间的HDFS文和盒HTables表就被删除了。

注意:

1. 必须在构建好新的cube后备份元数据,从而进行修改恢复

3. 若修改视图表(如添加字段),修改完毕后要reload一下

4. Purge Cube 后Hbase中存储的计算结果不会被删除,Hbase可查

5. 新Cube不能build旧Cube已经build过的相同日期的数据,若修复历史数据,需先删除旧的Segment

6. 若想修改字段名,必须Perge Cube,Hybrid 无法满足需求

7. 新增字段在build完毕后Kylin表才会更新字段信息

(完)

分享是一种美德!

想对你说:“

昨天越来越多,明天越来越少,这就叫人生。

你之所以觉得时间一年比一年过得快,

是因为时间对你一年比一年重要。

别因为害怕孤单而凑合着相拥,

也别因为一时的别无选择而将就的活着,

总要有一段路,需要你独自走过。

愿你是阳光,明媚不忧伤。”

Hbase|Kylin|Hive|Impala|Spark|Phoenix ect.

第一个专注Hbase公众号

虽没官方认证

但这一定是个负责任的公众号

将最好的祝福送给正在阅读的你,感恩!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180508G1LPRN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券