Kylin cuboid算法修改

缘由

    近期由于发现线上cube的构建时间太慢(一个项目的cube构建前一天的数据一般需要170分钟左右),目前我们接入的应用才三个,如果后期接入更多的cube之后会导致更慢的cube构建速度,于是深入了解了一下cuboid是如何确定的,看了代码之后发现和我们预想的不一样,于是经过咨询社区之后也觉得之前的算法是存在一定的问题(2.x版本已经对此做了修改),因此就准备对cuboid的计算进行修改。

Kylin原有cuboid算法

    了解了kylin中如何对cube进行优化(参见OLAP引擎——Kylin介绍Kylin使用之创建Cube和高级设置)之后,下面来看一下kylin是确定哪些cuboid需要计算,哪些是不需要计算的呢?

    在Kylin中保存cube的时候需要对cuboid进行校验,通过三种方案计算出生成cuboid的数量,然后对比三种方法生成的数量是否相同,如果不相同这说明cube的定义存在问题(例如一个hierarchy组的不如维度分布在不同的group中)。在Kylin中,使用位图来计算cuboid,每一个维度在位图上使用一个位置(所以维度超过64就会出现问题),每一个cuboid的值是一个long值,它的二进制中为0的位置表示对应的维度不出现在这个cuboid中,而为1的表示该cuboid是这些维度的组合。保存cube的时候会通过三种方式计算可能产生的cuboid个数,根据个数是否相同来判断cube的定义是否正确:

  • 根据树的根节点(base cuboid)计算它的spanning cuboid然后再一次计算每一个spanning cuboid的spanning cuboid,并将它们加入到set中,但是需要保证每一个cuboid的spanning cuboid是不相同的,因为如果重复可能会导致cuboid被重复计算,每一个cuboid在计算spanning cuboid是从它的child cuboid中过滤掉它的兄弟cuboid的child cuboid,这样就能够保证每一个cuboid的spanning是唯一的。
  • 从0开始,递增直到base cuboid(位图上所有维度对应的位置都为1),依次递增,对每一个cuboid判断它是否需要被计算,然后统计所有需要计算的cuboid个数。这种方法可能随着维度数的增加变得性能很差,试想32个维度的cube需要2的32次方的遍历。
  • <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值