理解总结

  • 0、前言
  • 1、能解决什么问题:
  • 2、工作原理 :
  • 3、几个前提
  • 4、错误率
  • 5、基本特征
  • 6、应用场景举例:
    • (1)拼写检查、数据库系统、文件系统
    • (2)假设要你写一个网络蜘蛛(web crawler)。
    • (3)网络应用
    • (4)垃圾邮件地址过滤
    • (5)Bloomfilter在HBase中的作用
  • 7、reduce side join + BloomFilter 在hadoop中的应用举例:

0、前言

之前收藏的一篇文章,找不到出处了,想标记转载,必须得给原网址,大佬勿怪

1、能解决什么问题:

以少量的内存空间判断一个元素是否属于这个集合, 代价是有一定的错误率

2、工作原理 :

  • 1.初始化一个数组, 所有位标为0, A={x1, x2, x3,…,xm} (x1, x2, x3,…,xm 初始为0)
  • 2.将已知集合S中的每一个数组, 按以下方式映射到A中
    • 2.0 选取n个互相独立的hash函数 h1, h2, … hk

      • 2.1 将元素通过以上hash函数得到一组索引值 h1(xi), h2(xi),…,hk(xi)
      • 2.2 将集合A中的上述索引值标记为1(如果不同元素有重复, 则重复覆盖为1, 这是一个觅等操作)
  • 3.对于一个元素x, 将其根据2.0中选取的hash函数, 进行hash, 得到一组索引值 h1(x), h2(x), …,hk(x)
    • 如果集合A中的这些索引位置上的值都是1, 表示这个元素属于集合S, 否则则不属于S
  • 举例说明:
    • 建立一个容量为500万的Bit Array结构(Bit Array的大小和keyword的数量决定了误判的几率),将集合中的每个keyword通过32个hash函数分别计算出32个数字,然后对这32个数字分别用500万取模,然后将Bit Array中对应的位置为1,我们将其称为特征值。简单的说就是将每个keyword对应到Bit Array中的32个位置上,见下图:
    • 当需要快速查找某个keyword时,只要将其通过同样的32个hash函数运算,然后映射到Bit Array中的对应位,如果Bit Array中的对应位全部是1,那么说明该keyword匹配成功(会有误判的几率)。

3、几个前提

  • 1.hash函数的计算不能性能太差, 否则得不偿失
  • 2.任意两个hash函数之间必须是独立的.
    • 即任意两个hash函数不存在单一相关性, 否则hash到其中一个索引上的元素也必定会hash到另一个相关的索引上, 这样多个hash没有意义

4、错误率

  • 工作原理的第3步出来的结论, 一个是绝对靠谱的, 一个是不能100%靠谱的。在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。关于具体的错误率,这和最优的哈希函数个数以及位数组的大小有关,而这是可以估算求得一个最优解的:
    哈希函数个数k、位数组大小m及字符串数量n之间存在相互关系。相关文献证明了对于给定的m、n,当 k = ln(2)* m/n 时出错的概率是最小的。
  • 具体的请看:http://blog.csdn.net/jiaomeng/article/details/1495500

5、基本特征

从以上对基本原理和数学基础的分析,我们可以得到Bloom filter的如下基本特征,用于指导实际应用。

  • (1)存在一定错误率,发生在正向判断上(存在性),反向判断不会发生错误(不存在性);
  • (2)错误率是可控制的,通过改变位数组大小、hash函数个数或更低碰撞率的hash函数来调节;
  • (3)保持较低的错误率,位数组空位至少保持在一半以上;
  • (4)给定m和n,可以确定最优hash个数,即k = ln2 * (m/n),此时错误率最小;
  • (5)给定允许的错误率E,可以确定合适的位数组大小,即m >= log2(e) * (n * log2(1/E)),继而确定hash函数个数k;
  • (6)正向错误率无法完全消除,即使不对位数组大小和hash函数个数进行限制,即无法实现零错误率;
  • (7)空间效率高仅保存“存在状态”,但无法存储完整信息,需要其他数据结构辅助存储;
  • (8)不支持元素删除操作,因为不能保证删除的安全性。

6、应用场景举例:

(1)拼写检查、数据库系统、文件系统

(2)假设要你写一个网络蜘蛛(web crawler)。

  • 由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。给一个URL,怎样知道蜘蛛是否已经访问过呢?

(3)网络应用

  • P2P网络中查找资源操作,可以对每条网络通路保存Bloom Filter,当命中时,则选择该通路访问。
  • 广播消息时,可以检测某个IP是否已发包。
  • 检测广播消息包的环路,将Bloom Filter保存在包里,每个节点将自己添加入Bloom Filter。
  • 信息队列管理,使用Counter Bloom Filter管理信息流量。

(4)垃圾邮件地址过滤

  • 像网易,QQ这样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。一个办法就是记录下那些发垃圾邮件的email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿个 email 地址,就需要1.6GB 的内存(用哈希表实现的具体办法是将每一个email 地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有50%,因此一个email 地址需要占用十六个字节。一亿个地址大约要1.6GB, 即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百GB 的内存。而Bloom Filter只需要哈希表1/8 到1/4 的大小就能解决同样的问题。Bloom Filter决不会漏掉任何一个在黑名单中的可疑地址。而至于误判问题,常见的补救办法是在建立一个小的白名单,存储那些可能别误判的邮件地址。

(5)Bloomfilter在HBase中的作用

  • HBase利用Bloomfilter来提高随机读(Get)的性能,对于顺序读(Scan)而言,设置Bloomfilter是没有作用的(0.92以后,如果设置了bloomfilter为ROWCOL,对于指定了qualifier的Scan有一定的优化,但不是那种直接过滤文件,排除在查找范围的形式)
  • Bloomfilter在HBase中的开销?
    • Bloomfilter是一个列族(cf)级别的配置属性,如果你在表中设置了Bloomfilter,那么HBase会在生成StoreFile时包含一份bloomfilter结构的数据,称其为MetaBlock;MetaBlock与DataBlock(真实的KeyValue数据)一起由LRUBlockCache维护。所以,开启bloomfilter会有一定的存储及内存cache开销。
  • Bloomfilter如何提高随机读(Get)的性能?
    • 对于某个region的随机读,HBase会遍历读memstore及storefile(按照一定的顺序),将结果合并返回给客户端。如果你设置了bloomfilter,那么在遍历读storefile时,就可以利用bloomfilter,忽略某些storefile。
  • 注意:hbase的bloom filter是惰性加载的,在写压力比较大的情况下,会有不停的compact并产生storefile,那么新的storefile是不会马上将bloom filter加载到内存的,等到读请求来的时候才加载。
  • 这样问题就来了,第一,如果storefile设置的比较大,max size为2G,这会导致bloom filter也比较大;第二,系统的读写压力都比较大。这样或许会经常出现单个 GET请求花费3-5秒的超时现象。

7、reduce side join + BloomFilter 在hadoop中的应用举例:

  • 在某些情况下,SemiJoin抽取出来的小表的key集合在内存中仍然存放不下,这时候可以使用BloomFiler以节省空间。将小表中的key保存到BloomFilter中,在map阶段过滤大表,可能有一些不在小表中的记录没有过滤掉(但是在小表中的记录一定不会过滤掉),这没关系,只不过增加了少量的网络IO而已。最后再在reduce阶段做表间join即可。
  • 这个过程其实需要先对小表的数据做BloomFilter训练,构造一个BloomFilter样本文件(二进制的),放到分布式缓存,然后在map阶段被读入用来过滤大表。而hadoop早已经支持 BloomFilter 了,我们只需调相应的API即可。

BloomFilter--理解总结相关推荐

  1. 【Redis基础和应用】(四)HyperLogLog BloomFilter

    HyperLogLog 0. 前言 对于一个常见的业务问题:如果你负责开发维护一个大型的网站,有一天需要实现一个需求,统计每个页面每天的UV数据,那么将如何实现? 这里补充一下UV和PV的知识 PV( ...

  2. HBase中Bloomfilter类型的设置及使用的理解

    1.Bloomfilter的原理?   可参考  http://hi.baidu.com/yizhizaitaobi/blog/item/cc1290a0a0cd69974610646f.html 2 ...

  3. 三种去重方式——HashSet、Redis去重、布隆过滤器(BloomFilter)

    三种去重方式 去重就有三种实现方式,那有什么不同呢? HashSet 使用java中的HashSet不能重复的特点去重.优点是容易理解.使用方便. 缺点:占用内存大,性能较低. Redis去重 使用R ...

  4. BloomFilter算法概述

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. Bloom Filter是由Bloom ...

  5. 【算法】BloomFilter 如何判断一个元素在亿级数据中是否存在?

    1.概述 转载: 如何判断一个元素在亿级数据中是否存在? 前言 最近有朋友问我这么一个面试题目: 现在有一个非常庞大的数据,假设全是 int 类型.现在我给你一个数,你需要告诉我它是否存在其中(尽量高 ...

  6. 四 过滤模式 map Only - 作业完成 bloomFilter、top10、去重

    第四部分所有的模式涉及一个共同点: 不会改变原有的记录. 这些模式都是寻找数据子集的,不管结果集的规模是小(top10)还是大(像去重结果). 与第三部分差异是,他们通过对数据的相思子端坐概要与分组来 ...

  7. 海量数据去重的Hash与BloomFilter学习笔记

    文章目录 知识框架 背景 例子 平衡二叉树 散列表 介绍 hash函数 选择hash的经验 负载因子 冲突处理 布隆过滤器 介绍 组成 原理 为什么不支持删除操作? 应用场景 应用分析 如何确定n和p ...

  8. Spark - BloomFilter 推导与工业界应用

    1.引言 上一篇文章  BitMap 的增删改查 介绍了如何使用 Bit 存储大规模数据以及对数据进行遍历和去重.常规数量的元素去重可以使用 HashSet ,但是受内存原因影响 HashSet 不方 ...

  9. bloomFilter和哈希函数murmur3

    Murmur哈希算法是一种非加密hash算法,适用于哈希查找. 优点是时间和空间消耗较少,可检索一个元素是否在集合中 缺点是误识别率和删除困难 bloomFilter原理 ​ 元素被加入集合时,选择k ...

  10. 【数据结构】布隆过滤器:BloomFilter原理及Java实现

    布隆过滤器(Bloom Filter)是一个叫做 Bloom 的大佬在1970年提出的.我们可以把它看做由二进制向量(或者说数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构.相比于我们平时用 ...

最新文章

  1. 你有一张世界互联网大会的门票待领取!数字经济人才专场报名开启
  2. 基于单片机的超市储物柜设计_基于51单片机对电子储物柜系统的设计
  3. 产品经理的成长历程(宏观)
  4. 产品设计体会(9000)人人都是产品经理,系列说明
  5. 将手机网站做成手机应用的JS框架
  6. mysql 数据库的 导入于导出
  7. predict函数 R_R包randomForest的随机森林回归模型以及对重要变量的选择
  8. 【Latex】数学公式排版
  9. FusionCharts 分类以及各个属性参数列表
  10. gridview生成的html,.NET_GridView生成的HTML代码示例对比,复制代码 代码如下: asp:GridV - phpStudy...
  11. 清华大学829考研 初试436经验谈
  12. CS224N WINTER 2022(四)机器翻译、注意力机制、subword模型(附Assignment4答案)
  13. codesys工程ST语言学习笔记(一)建立工程与编译
  14. 新域名后缀的主要优点是什么?
  15. jdk重复安装,Error:Registry key ‘Software\JavaSoft\Java Runtime Environment\CurrentVersion(已解决)
  16. 黑马linux系统编程
  17. Perl之Spreadsheet::WriteExcel安装
  18. arp攻击实验(一)用一条指令让对方瞬间无法上网
  19. Java线程同步容易犯错的坑
  20. matlab如何在等值线填充图上叠加等值线

热门文章

  1. 注意GetMessage()的返回值
  2. 【已解决】Https请求报错:unable to find valid certification path to requested target
  3. 树莓派连接使用5寸HDMI触摸屏的方法
  4. python练习:重新排列句子中的单词
  5. 万物互联来袭 你准备好迎接5G新时代了吗?
  6. 35岁不交社保,每年存1万块,存20年,够养老吗?
  7. codefroces13A
  8. tomcat 7.0
  9. 三郎前端特效学习源代码:图片主页轮播组件
  10. HNU-计算机系统-讨论课5