cube表调优在数仓当中是经常遇到,这里给出常见的调优方式和策略。其实就是拿sql的复杂度来换时间。如果需要快速响应的OLAP,可以参考Kylin等组件。
1. 避免不必要distinct
在统计时我们可能需要统计订单数,用户数等等,这个时候我们应该要明确表的最细粒度是什么,例如订单表的最细粒度是订单id,对于以最小粒度为统计目标的指标,我们并不需要加distinct去重。需要注意的是每增加一个distinct,我们的数据量在map阶段就会增加一倍,而这些膨胀的数据后会通过网络传输到reduce,必然会造成很大的浪费。具体原理可以参考
https://tech.meituan.com/2014/02/12/hive-sql-to-mapreduce.html。
2.减小数据总量
distinct倍增无法避免,但是我们可以将distinct的指标分开处理,创建一个临时表,并通过where条件 过滤掉部分数据,再通过groupby,将数据去重,进一步减少数据的总量,再进行统计,再与主表join。
3.去除衍生维度
类似城市id与城市名两者表达含义相同,我们在做聚合时可以考虑将衍生维度过滤,再计算出结果之后再通过维表将相应的衍生维度冗余回来。可以减少一部分的压力。
4.拆维度
经过以上的操作,如果作业的运行时长还是很长,为了确保及时产出,我们就需要拆维度,将原本的维度表拆分成2个或者多个维度表。拆表时需要考虑到将那个维度拆解出来。拆分主要考虑是否是核心维度,就是该维度与其他维度组合频率高,这样拆开的表能保证仍有一定的使用频率,避免创建表但无人使用的情况。
以上针对的是数据量一般,业务对响应时间无感。只需要每天按时拿到响应的报表数据,进行分析的业务场景。
5.使用专业的OLAP组件
如果你的数据量比较大,例如上千万,又想响应时间短,在秒级时间内完成查询。可以尝试使用Kylin来生成cube表,感兴趣的同学可以自行搜索相关内容。
总结
调优的主要目的就是减少cube表的倍增数据量。由于mapreduce的特性,我们通过减少总行数,总列数,甚至直接减少单个表的维度来减少数据生成的耗时,保证数据的及时产出。当基本数据量达到一定量级,或者维度过多,cube表太多,管理迭代困难,可以尝试使用接入Kylin来进行统一管理。