技术分享布隆过滤器原理及在HBase应用
Posted 桌面数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术分享布隆过滤器原理及在HBase应用相关的知识,希望对你有一定的参考价值。
bloomfilter 也称“布隆过滤器”,是由 Howard Bloom 于 1970 年提出的二进制向量数据结构,简单的逻辑就是将一个数据值映射到一个二进制L长度的K个位上,有点类似于bit-map的情况,它可以以较低的空间占用去判断某一个元素是不是在某个集合中,对于元素不在集合中的情况的判断率是100%的,但是对于元素在某个集合的情况的判断率是有误差的,误差可以根据数据量通过调整K(hash的次数)和L(存储的长度)来控制,此过滤器可以应用在网络爬虫对已爬过的网页过滤、垃圾电子邮件过滤、号码验证、关键词检测等方面,Hbase 中也应用了Bloom Filter (详情可参考[HBASE-1200])去提高随机查询效率,文章后面会做详细说明。
首先用一个实例去讲解一下Bloom Filter的原理:目前有 n个元素 {x0,x1,x2,x3.....} 有一个L长度的位数组bitset并且全部置为0,
有K个不同的hash函数 hash1(x) ...hashk(x),或者一个hash函数但是通过参数可以去控制,在BloomFilter中,函数的选择至关重要直接影响性能和准确率,关于hash函数应该是独立的第三方并且值要均匀分布的,而且要有良好的速度性能(像sha1这种加密函数,虽然应用比较广泛但是不是好的选择),满足以上条件的hash函数可以采用比如 murmur hash (在Cassandra 和 Hbase都有应用)、fnv系列hash还有Jenkins Hashes, 对于想深入了解hash性能的可参考https://github.com/bitly/dablooms/pull/19。
对某一个值X经过几个hash之后所产生的值根据位的位置将原先的0置换为1 比如K 为3的话,在hash后对应 1、3 、5位,另一个值Y经过hash后生成2,4,6,不同的值hash后可能会产生相同的值所以也会有一定的误差,此处产生的值无相同并比较接近只是为了方便颜色区分
通过上面重复操作,最后会形成一个含有0或1的L长度的位数组,当判断一个元素X是不是在集合中时,只需要把X经过k次hash后看对应的位是不是全是1即可,如果全是1的话,则可能在集合中,但是不全是1的话则表示肯定不在集合中。
例如一个值Z经过hash后 在 2、4、5上都是1,但实际情况是Z并不真正的在集合中,但是如果hash后是 2、4、7则表示Z肯定不在集合中。
通过上面的说明你会发现位数组的长度、元素个数以及hash个数是对准确率存在影响的,如果数组长度用m表示,插入个数用n表示,函数个数用k表示,则误算率可通过如下公式计算(具体公式推导过程可参考对应的wiki):
通过上面的公式我们可以根据相应的准确率等信息推导出采用布隆过滤器后所占用空间大小,通过计算我们会发现空间占用会比原先小的多。
下面说一下Bloom Filter 在hbase中的应用:
在hbase中启用Bloom Filter 可以以消耗内存为代价减少磁盘IO,增加读的效率,布隆过滤器针对每个CF进行开启,对于设置布隆过滤器有三个级别,默认是NONE(基于0.94),还可以是ROW和ROWCOL,如果是ROW则每次将新添加的row进行hash后添加metablock,如果是ROWCOL则格式为row+cf+column。查询效率提高主要是指get ,在get的时候会查找hfile中metablock,其中包含了布隆过滤器的结构,另外hbase默认的hash 是murmur,在配置文件中关于bloom的大多设置以 io.storefile.bloom开头,比如可以通过io.storefile.bloom.error.rate设置容错率。
以上是关于技术分享布隆过滤器原理及在HBase应用的主要内容,如果未能解决你的问题,请参考以下文章