数据人生
首发于数据人生
布隆过滤器在实时指标计算中的应用

布隆过滤器在实时指标计算中的应用

在实时指标计算中,经常需要进行去重判断和处理,比如实时统计UV(按用户去重访问量),同时为了追求指标计算的性能,一般都是在内存中完成计算逻辑,中间数据也需要放在内存中,这就带来了内存消耗过多的问题,尤其当去重的明细数据达到上亿甚至更多的时候。

那么如何更好的适应实时指标计算中的去重处理呢:

1、精确去重:这种情况下明细数据需要保存,同时可以通过数据倾斜的方式,对去重值进行分桶Hash,把一个节点的内存压力分到多个节点上,再把每个桶里面的值进行加和。关于Hash的介绍可以看这篇文章:Hash介绍

2、模糊去重:如果业务统计的精度要求不高,可以使用相关的去重算法,可以大大降低内存的使用量。常用的模糊去重算法有布隆过滤器和基数估计。

本文主要介绍一下布隆过滤器

  • 布隆过滤器(Bloom Filter)是由Howard Bloom在1970年提出的二进制向量数据结构,它具有很好的空间和时间效率,尤其是空间效率极高,BF常常被用来检测某个元素是否是巨量数据集合中的成员。
  • BF可以高效地表征集合数据,其使用长度为m的位数组来存储集合信息,同时使用k个相互独立的哈希函数将数据映射到位数组空间。其基本思想如下:首先,将长度为m的位数组元素全部置为0。对于集合S中的某个成员a,分别使用k个哈希函数对其计算,如果hi(a)=x(1≤i≤k,1≤x≤m),则将位数组的第x位置为1,对于成员a来说,经过k个哈希函数计算后,可能会将位数组中的w位(w≤k)设置为1。对于集合中的其他成员也如此处理,这样即可完成位数组空间的集合表示。
  • 查询的时候:使用相同的k个哈希函数计算,如果其对应位数组中的w位(w≤k)都为1,则判断成员属于集合;只要有任意一位为0,则判断成员不属于集合。BF可能会出现误判:即判断为属于集合但实际不属于集合,但BF不会出现漏判:即判断为不属于集合那一定不属于集合。
  • BF的误判率是可以控制的,计算出来的去重值比真实值小,采用布隆过滤器算法存储1亿条数据只需要存储100多MB的空间。
  • 适用场景:统计精度要求不高,统计维度值非常多,比如统计各个商家的UV数据。
编辑于 2017-11-12

文章被以下专栏收录