flink广播变量太大问题

1. 问题背景

flink广播变量适用于解决活动配置、白名单等应用场景,根据活动配置或者白名单过滤数据后再做后续加工处理。广播出去的变量存在于每个节点的内存中,所以这个数据集不能太大。如果海量数据中,需要过滤出几百万甚至上亿的白名单用户数据,用广播变量广播大量用户uid,显然不合适。

另外,实际的场景,白名单用户可能会增删,增加了要能检查出来,删除了不一定需要,宁可放过,不能错杀(主要是后面数据不关心因误判导致多余用户的数据)。

2. 解决方案

根据前面问题描述,布隆过滤器是一个很好的解决方案,不需要太大的内存,也满足宁可放过不许错杀的要求。

2.1 标准布隆过滤器

使用标准布隆过滤器,任务启动时候先将白名单用户写入布隆过滤器。然后数据流进来时,使用布隆过滤器检查用户是否已经存在:如果存在,有可能实际不存在;如果不存在,那就一定不存在。

优点:

  • Bloom filter 优点就是它的插入和查询时间都是常数
  • 查询元素却不保存元素本身,具有良好的安全性

缺陷:

  • 可能误判:判定用户存在白名单中,但实际用户不在白名单
  • 不支持反向操作:即只能增加白名单,不能删除白名单
  • 不支持计数:计数布隆过滤器可以解决
  • 查询性能弱:因为布隆过滤器需要使用多个 hash 函数探测位图中多个不同的位点,这些位点在内存上跨度很大,会导致 CPU 缓存行命中率低。
  • 空间利用率低:因为在相同的误判率下,布谷鸟过滤器的空间利用率要明显高于布隆,空间上大概能节省 40% 多。不过布隆过滤器并没有要求位图的长度必须是 2 的指数,而布谷鸟过滤器必须有这个要求。从这一点出发,似乎布隆过滤器的空间伸缩性更强一些。

2.2 计数布隆过滤器

标准Bloom filter对于需要精确检测结果的场景将不再适用,而带计数器的Bloom filter的出现解决了这个问题。Counting Bloom filter实际只是在标准Bloom filter的每一个位上都额外对应得增加了一个计数器,在插入元素时给对应的 k (k 为哈希函数个数)个 Counter 的值分别加 1,删除元素时给对应的 k 个 Counter 的值分别减 1。
优点:

  • 支持删除元素
  • 查询更加精准

缺点:

  • 存储空间是标准布隆过滤器的3-4倍

2.3 布谷鸟过滤器

2.3.1 布谷鸟哈希介绍

最简单的布谷鸟哈希结构是一维数组结构,会有两个 hash 算法将新来的元素映射到数组的两个位置。如果两个位置中有一个位置为空,那么就可以将元素直接放进去。如果两个位置都满了,随机踢走一个,自己霸占了这个位置。被挤走的元素看自己的另一个位置有没有空,如果空了就挪过去,如果被别的元素占了,那再来一次鸠占鹊巢,直到新的被踢元素找到自己的位置为止。

2.3.2 布谷鸟哈希的问题

数组拥挤:如果数组太拥挤了,反复踢除元素,这时候会严重影响插入效率。这时候布谷鸟哈希会设置一个阈值,当连续占巢行为超出了某个阈值,就认为这个数组已经几乎满了,就需要对它进行扩容,重新放置所有元素。

循环挤兑:两个不同的元素,hash 之后的两个位置正好相同,这时候它们一人一个位置没有问题。但是这时候来了第三个元素,它 hash 之后的位置也和它们一样,很明显,这时候会出现挤兑的循环。不过让三个不同的元素经过两次 hash 后位置还一样,这样的概率并不是很高,除非你的 hash 算法太挫了。布谷鸟哈希算法对待这种挤兑循环的态度就是认为数组太拥挤了,需要扩容(实际上并不是这样)。

2.3.3 布谷鸟哈希的优化

布谷鸟哈希算法的平均空间利用率并不高,大概只有 50%。到了这个百分比,就会很快出现连续挤兑次数超出阈值。这样的哈希算法价值并不明显,所以需要对它进行改良。

  • 增加哈希函数进一步提高空间利用率
  • 增加哈希表,每个哈希函数对应一个哈希表,每次选择多个张表中空余位置进行放置。三个哈希表可以达到80% 的空间利用率。
  • 增加哈希函数+增加哈希表。这样既可以得到时间效率,又可以得到空间效率。这样的组合甚至可以将空间利用率提到高 99%,这是非常了不起的空间效率。

2.3.4 布谷鸟过滤器

布谷鸟过滤器和布谷鸟哈希结构一样,它也是一维数组,但是不同于布谷鸟哈希的是,布谷鸟哈希会存储整个元素,而布谷鸟过滤器中只会存储元素的指纹信息(几个bit,类似于布隆过滤器)。这里过滤器牺牲了数据的精确性换取了空间效率。正是因为存储的是元素的指纹信息,所以会存在误判率,这点和布隆过滤器如出一辙。

布谷鸟过滤器,它可以代替布隆过滤器进行集合近似隶属度测试。 布谷鸟过滤器支持动态添加和删除项,同时实现比布隆过滤器更高的性能。对于存储了许多条目且设置较低假阳性率的应用程序,布谷鸟过滤器比空间优化过的布隆过滤器具有更低的空间开销。我们的实验结果还表明,布谷鸟过滤器在时间和空间上的性能都优于此前那些扩展了布隆过滤器以支持删除的数据结构。

优点:

  • 支持删除操作
  • 性能比标准过滤器高
  • 空间利用率比标准过滤器高

缺点:

  • 限制长度为2的指数倍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值