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元数据存储的备份
export KYLIN_HOME="/path/to/kylin"
$KYLIN_HOME/bin/metastore.sh backup
这将创建一个备份文件夹,假定它是$ KYLIN_HOME / metadata_backup / 2015-09-25 /
第2步:创建子文件夹“hybrid”
mkdir -p $KYLIN_HOME/metadata_backup/2015-09-25/hybrid
第3步:创建混合实例json文件:
vi $KYLIN_HOME/metadata_backup/2015-09-25/hybrid/my_hybrid.json
像下面这样的输入内容,“名称”和“uuid”需要是唯一的:
{
"uuid": "9iiu8590-64b6-4367-8fb5-7500eb95fd9c",
"name": "my_hybrid",
"realizations": [
{
"type": "CUBE",
"realization": "Cube_V1"
},
{
"type": "CUBE",
"realization": "Cube_V2"
}
]
}
这里“Cube_V1”和“Cube_V2”是你想合并的Cube名称。
第4步:将混合实例添加到项目
使用文本编辑器打开项目json文件(例如项目“default”):
vi $KYLIN_HOME/metadata_backup/2015-09-25/project/default.json
在“realizations”数组中,添加一个如下所示的条目,类型需要是“HYBRID”,“实现”是混合实例的名称:
{
"name": "my_hybrid",
"type": "HYBRID",
"realization": "my_hybrid"
}
第5步:上传元数据:
$KYLIN_HOME/bin/metastore.sh restore $KYLIN_HOME/metadata_backup/2015-09-25/
请注意,“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:如果子立方体被禁用,它是否会通过混合动力进行扫描?
不会; 混合实例会在发送查询之前检查子实现的状态; 所以如果立方体被禁用,它将不会被扫描。
注意:
1. 必须在构建好新的cube后备份元数据,从而进行修改恢复
2. 修改完元数据后必须重启kylin集群或者重新载入元数据,否则报错(Overwriting conflict /project/***.json, expect old TS 1525758479256, but it is 152576031000)
3. 若修改视图表(如添加字段),修改完毕后要reload一下
4. Purge Cube 后Hbase中存储的计算结果不会被删除,Hbase可查
5. 新Cube不能build旧Cube已经build过的相同日期的数据,若修复历史数据,需先删除旧的Segment
6. 若想修改字段名,必须Perge Cube,Hybrid 无法满足需求
7. 新增字段在build完毕后Kylin表才会更新字段信息
清除Hbase无用数据表
当我们对cube执行purge/drop/merge时,一些HBase的表可能会保留在HBase中,而这些表不再被查询,尽管Kylin会做一些自动的垃圾回收,但是它可能不会覆盖所有方面,所以需要我们能够每隔一段时间做一些离线存储的清理工作。具体步骤如下:
1. 检查哪些资源需要被清理,这个操作不会删除任何内容:
${KYLIN_HOME}/bin/kylin.sh org.apache.kylin.storage.hbase.util.StorageCleanupJob --delete false
2. 根据上面的输出结果,挑选一两个资源看看是否是不再需要的。接着,在上面的命令基础上添加“–delete true”选项,开始执行清理操作,命令执行完成后,中间的HDFS文和盒HTables表就被删除了。
(完)