前言
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公众号
虽没官方认证
但这一定是个负责任的公众号
将最好的祝福送给正在阅读的你,感恩!
领取专属 10元无门槛券
私享最新 技术干货