kylin简介
Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。整体架构如下:
其中我们最关注也是最重要的部分为cube构建性能和查询性能。针对不同的业务场景,在model、cube设计时考虑更多的业务,以得到最优最适合的模型、cube。那如果没有具体的业务场景应该怎么做呢,假使一个kylin新上了一个业务场景,我们对这个业务场景还不是很熟悉的情况下,如何优化能够使Cube的体积更小、查询速度更快呢。在kylin2.3+的版本中引入了一个cube planner的功能。
在没有优化cube的前提下, kylin会计算每一种维度的组合,这也是kylin的核心:预计算。没中维度计算得到的结果叫做cuboid,cuboid的数量计算公式为2的n次方,n为数据的维度个数。如果是10个维度的数据,不做任何优化, 生成的cuboid数量为1024个cuboid;如果是20个维度,cuboid数量1048576个。那么这个时候的cube计算和存储的压力非常大。这个时候需要对我们的cube做一些优化,在了解业务背景的情况下,可以针对不同的查询模式对维度进行剪枝,kylin提供了聚合组,包括必需维度、层级维度、联合维度,能够显著降低cube的膨胀率,减少cuboid数量,达到优化的目的。
在我们对kylin的的cube优化技巧不够了解的情况下,或者对数据的查询模式不熟悉的情况下,cube planner可以为我们省下很多时间。
cube planner介绍:
cube planner实际上就是从2的n次方中维度组合中挑选出部分添加到推荐列表中以进行后续的构建。挑选的规则在于cuboid的收益和成本之比,也就是效益比。
cuboid的成本主要包括:
- 构建成本:维度组合的数据行数
- 查询成本:查询该cuboid需要扫描的行数
其中,相同的数据一般只会构建一次,而查询是很多次的,所以我们忽略掉构建成本,只考虑查询成本。即:预计算这个cuboid,相比没有这个cuboid对整个cube的所有查询能减少的查询成本。
选择过程
假入有一个cube,有如上图所示的维度组合,
维度组合ID | 维度 |
---|---|
a(100行) | 时间、地区、id 、name |
b(50行) | 时间、地区、id |
c(75行) | 时间、id 、name |
d(20行) | 地区、id |
e(30行) | 地区 |
f(40行) | 时间、name |
g(5行) | 时间、 id |
算法步骤:
- 因为维度组合a是Base Cuboid,默认是一定会被预计算的,所以a被加入推荐列表。在当前只有a被计算的情况下,查询剩余所有维度组合都必须通过a,查询成本为100(扫描a所需需的行数)
- 估算b的收益比,如果预计算b,那么对于b和其子孙e、f等维度组合的查询都可以通过扫描50行的b来得到。相较于a,查询成本从100降为50,因此预计算b对整个cube的增益为(100-50)*3=150,效益比就是除以b的行数:150/50=3。
- 根据第二步的方法计算c、d、e、f、g的效益比:
c:1.67
d:8
e:7
f: 3
g:19 - 重复第2、3步骤,每轮迭代都加入一种维度组合,直到达到约束条件:
a,推荐列表中的维度组合膨胀率达到cube膨胀率(kylin.cube.cubeplanner.expansion-threshold,默认值15.0)
b,本轮选中的维度组合效率比低于既定的最小阈值(默认值 0.01),说明新增加的维组合性价比已经降低了,不需要更多的维度组合了。
c,算法运行时间达到既定上限。
这种算法也就是贪心算法,还有另外一种基因算法,这里不做介绍, 在配置中可以选择不同的算法来进行优化:
kylin.cube.cubeplanner.enabled=true(默认为false)
kylin.cube.cubeplanner.expansion-threshold=15.0(默认为15.0)
##下面两个参数决定挑选cuboid的算法为基因算法还是贪心算法
##当维度组合小于2的4次方,不适用cube planner
##当维度组合数大于2的4次方且小于2的8次方,使用贪心算法进行选择cuboid
##当维度组合数大于2的8次方,使用基因算法进行选择cuboid
kylin.cube.cubeplanner.algorithm-threshold-greedy=4
kylin.cube.cubeplanner.algorithm-threshold-genetic=8
当你的设计目的是一个自由查询、灵活拖拽的模型,可以选择cube planner。