分块计算是将数据按一定的规则切割成若干份,然后分别计算,再将结果合并汇总得到最终结果。
经常统计时会涉及到一次要对几千万甚至几十亿的数据进行聚合计算(或表关联),因为硬件本身的限制(特别是没有足够大的内存和临时表空间),往往显得无能为力。这时如果不人为去将数据进行分割计算(或关联),系统将会陷入异常缓慢的计算过程甚至因临时表空间不足而崩溃。
分块计算最重要的是找到一个字段作为分割数据的依据,使得计算结果里不包含重复累加的值。以渠道统计为例,最初我们按软件对4取模,平台对2取模的方式,将数据分成8张表。如下图:
这种分割在刚开始时确实效果比较明显,但随着数据量的增加(软件的用户量不同),不同表间的数据量差异越来越大,有的表数据量很大,有的又很少,大表在关联更新数据时就显得很慢。下面是关联更新的日志(softIdMod=0,platformMod=0即为Sjqd_Users_S0_P0表):
后面我们改用IMEI作为分割依据(只要将相同IMEI的数据分在同一个分块里就不会出现重复统计的问题),将分表改为分区,原本想用IMEI后两位作为分区列,但结果数据分布也不是很均匀。目前的作法是先求出IMEI的Hash
Code值,然后再对128取模,将得到的值作为分区列,从下图可以看出分布非常的均匀(这是其中几个分区,第一列是分区列值,每二列为对应的行数):
注:改进后的分区方案也可作为分服务器并发计算的基础,同时也可作为抽样统计的依据。