赞
踩
Apache Kylin的核心思想是根据用户的数据模型和查询样式对数据进行预计算,并在查询时直接利用预计算结果返回查询结果。Kylin具有响应时间快、查询时资源需求小,吞吐量大等的特点。
在构建Cube之前,Cube的优化手段提供了更多与数据模型或查询样式相关的信息,用于指导构建出体积更小、查询速度更快的Cube。
在没有采取任何措施的情况下,Kylin会对每一种维度的组合进行预计算,每种维度的组合的预计算结果被称为Cuboid。
1.1检查Cuboid数量
Apache Kylin提供了一个简单的工具,供用户检查Cube中哪些Cuboid最终被预计算了,称其为被物化(Materialized)的Cuboid。
1.2检查Cuboid大小
在Web GUI的Model页面选择一个REDAY状态的Cube,光标移动到上边时,会提示Cube的源数据大小,以及当前Cube的大小除以源数据大小的比例,称为膨胀率。Cube的膨胀率应该在0%~100%之间。
1.3空间与时间的平衡
理论上所有能用Cuboid处理的查询请求都可以使用Base Cuboid来处理,就好像所有能用Base Cuboid处理的查询请求都能通过直接读取源数据的方式处理一样。
Kylin的核心优势在于使用额外的空间存储预计算的结果,以换取查询时间的缩减。而Cube的剪枝优化则是一种试图减少额外空间占用的方法。前提是不会明显影响查询时间的缩减。
2.1使用衍生维度
衍生维度——用于在有效维度内将维度表上的非主键维度排除掉,并使用维度表的主键(其实是事实表上相应的外键)来替代它们。Kylin会在底部记录维度表主键与维度表其他维度之间的映射关系,以便在查询时能够动态地将维度表的主键“翻译”成这些非主键维度,并进行实时聚合。
2.2使用聚合组
聚合组(Aggregation Group)是一种更为强大的剪枝工具。聚合组假设一个Cube的所有维度均可以根据业务需求划分成若干组(当然也可以是一个组),由于同一个组内的维度更可能被同一个查询用到,因此会表现出更加紧密的内在关联。
对于每个分组内部的维度,用户可以使用三种可选方式定义它们之间的关系:强制维度(Mandatory)、层级维度(Hierarchy)、联合维度(Joint)。
当Segment中某一个Cuboid的大小超出一定的阈值时,系统会将该Cuboid的数据分片到多个分区中,以实现Cuboid数据读取的并行化,从而优化Cube的查询速度。
将以减少Cuboid数量为目的的Cuboid优化统称为Cuboid剪枝。这里通过Cube的Rowkeys方面的设置来优化Cube的查询性能。
Cube的每个Cuboid中都包含了大量的行,每个行有分为Rowkeys和Measure部分。每个Cuboid数据中的Rowkeys都包含当前Cuboid中所有维度值的组合。
4.1编码
编码(Encoding)代表了该维度的值应该使用何种方式进行编码,合适的编码能够减少维度对空间的占用。目前,Kylin支持的编码方式有以下几种:Date编码,Time编码,Integer编码,Dict编码,Fixed_length编码。
4.2按维度分片
默认情况下,Cuboid的分片策略是随机的。按维度分片(Shard by Dimension)提供了一种更加高效的分片策略,那就是按照某个特定维度进行分片。简单地说,如果Cuboid中某两行的Shard by Dimension的值相同,那么无论这个Cuboid最终会被划分成多少个分片,这两行数据必然会被分配到同一个分片中。
4.3调整Rowkeys顺序
Kylin会把所有的维度按照顺序粘合成一个完整的Rowkeys,并且按照这个Rowkeys升序排列Cuboid中所有的行。在调整Rowkeys的顺序时需要注意一下几个原则:
5.1降低度量精度
5.2及时清理无用的Segment
参考资料:《Apache Kylin权威指南》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。