布隆过滤器浅析

原理及特点

    布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。
    它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。
    布隆过滤器本质上是一种高效的数据结构,概率型的数据结构。
    特点是能够高效的插入和查询,可以告诉你“某个数据一定不存在或者可能存在”,但并不能告诉你一定存在。 
    相比于传统的List,Set等数据结构,它的占用空间更小,缺点是返回的结果是概率性的,不是确切的。

哈希函数与布隆过滤器长度计算公式

在这里插入图片描述

原理

在这里插入图片描述
当一个元素被加入集合时,通过k个散列函数将这个元素映射成一个bit数组中的k个点,把它们置为1。如果这些点有任何一个0,那么被检元素一定不存在;如果都是1,则被检元素就很可能存在。

优缺点

1.优点
1.空间效率和查询时间都远远超过一般的算法;
2.散列函数相互之间没有关系,方便由硬件并行实现;
3.布隆过滤器不需要存储元素本身。
2.缺点
1.存在误判;
2.布隆过滤器的不当使用有可能产生大Value,增加 redis等的阻塞风险;
3.一般情况下不能从布隆过滤器中删除元素。

应用场景

1.爬虫去重
网页爬虫对 URL 的去重,避免爬取相同的 URL 地址。
2.反垃圾邮件
反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱
3.Redis缓存击穿
将已存在的缓存放到布隆中,当黑客访问不存在的缓存时迅速返回避免缓存及DB挂掉

爬虫去重

1.应用原因
当我们要对海量URL进行抓取的时候,我们常常关心一件事,就是URL的去重问题,对已经抓取过的URL我们不需要在进行重新抓取。在进行URL去重的时候,我们的基本思路是将拿到的URL与已经抓取过的URL队列进行比对,看当前URL是否在此队列中,如果在已抓取过的队列中,则将此URL进行舍弃,如果没有在,则对此URL进行抓取。
2.算法思想
1.创建一个布隆过滤器,开辟一个足够的位空间(二进制向量);
2.设计一些种子数,用来产生一系列不同的映射函数(哈希函数);
3.使用一系列的哈希函数对此URL中的每一个元素(字符)进行计算,产生一系列的随机数,也就是一系列的信息指纹;
4.将一系列的信息指纹在布隆过滤器中的相应位,置为1。

反垃圾邮件

1.方案设计
1.将所有垃圾邮箱地址存到数据库,匹配时遍历。
2.用HashSet存储所有地址,匹配时接近O(1)的效率查出来。
3.将地址用MD5算法或其他单向映射算法计算后存入HashSet,无论地址多大,保存的只有MD5后的固定位数。
4.布隆过滤器,将所有地址经过多个Hash算法,映射到一个bit数组。
分析对比
1.方案1和2都是保存完整的地址,占用空间大。
2.方案3保存部分信息,占用空间小于存储完整信息,存在冲突的可能。
3.方案4将所有地址经过Hash后映射到同一个bit数组,占用空间极小,冲突概率高。
2.算法思想
1.初始化状态是一个全为0的bit数组;
2.为了表达存储N个元素的集合,使用K个独立的函数来进行哈希运算。x1,x2……xk为k个哈希算法。
3.依次对N2,NN等所有数据进行散列,最终得到一个部分为1,部分位为0的字节数组。
初始状态
运算结束
如何判断是否重复???
只需要依次经历x1,x2……xk个哈希算法即可。

Redis缓存击穿

1.应用原因
大量请求访问时,Redis没有命中数据,导致请求绕过了Redis缓存,直接去访问数据库了。数据库难以承受大量的请求。此时便可以使用布隆过滤器来解决。请求到来时,先用布隆过滤器判断数据是否有效。
2.算法思想
当请求数据库中不存在的数据,这时候所有的请求都会打到数据库上,这种情况就是缓存穿透。如果当请求较多的话,这将会严重浪费数据库资源甚至导致数据库宕机。
因此我们可以利用布隆过滤器把不存在的key进行过滤从而减少不存在key的请求

训练过程

1.使用一个预先确定的词集合产生一个布隆过滤器;
2.将布隆过滤器解释成一个值的列表,结果数据对象存储在hdfs上;
3.使用一个值的列表训练布隆过滤器。这个过程是通过加载存储的数据,并将每条记录加入到布隆过滤器中实现的;
4.表示数据集;
5.输入参数为一个关键词输入文件、文件中的元素数目、一个可以容忍的误判率、输出的文件名。

训练过程流程图

在这里插入图片描述

过滤过程

1.布隆过滤器(训练得到)的获得:Hadoop提供了DistributedCache。布隆过滤器是从DistributedCache中反序列化出来的;
2.读取输入记录,通过分词(tokenized)处理得到一系列的词,并清洗掉不相关的字符;
3.基于布隆过滤器对清洗后的词进行测试;
4.如果这个词被判定在布隆过滤器出现(使用filter.membershipTest函数),则整条记录输出到文件系统;
5.无reducer方法。所有输出记录会直接写入文件系统。

过滤流程图

在这里插入图片描述

性能分析

针对最大误判率为0.1、0.01、…、0.0000001共7种情况,以comments数据集为例,对结果的总记录条数、过滤用时、过滤速度、准确率进行分析。

分析方法

1)总记录条数
对布隆过滤结果文件夹中,所有文件名形如part-m-0000x的文件的记录条数,用LineNumberReader类的getLineNumber()函数统计并求和。
2)用时
在job执行前后,分别用System.currentTimeMillis()函数获取时间并作差,并存入结果文件夹的time.txt文件中。
3)速度
用Comment.xml记录条数,即待过滤的总记录数,除以遍历各个time.txt文件得出的用时,得到速度。
4)准确率
Comments.xml记录条数为2000000,所以最大误判率为0.0000001时,误判条数小等于0.2,即所有记录均正确。用过滤结果总记录数,除以最大误判率为0.0000001时的结果总记录数,得到准确率。

分析结果

在这里插入图片描述

可视化结果

在这里插入图片描述

小感悟

第一次写博客,希望自己能有个好的开始,有感兴趣的朋友,可以互相关注一下吗。。。

日期:2020-10-23

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值