hbase 布隆过滤器

前几天,和同事聊天发现他们对于HBase的的过滤器只知道查询过滤器,并不知道布隆过滤器什么,所以今天的文章就来说说特殊的过滤器 - 布隆过滤器。

 

基本理论:
。首先要知道布隆过滤器的作用在HBase的中我们查找一个rowkey时,HBase的会通过一下三个步骤查询我们匹配的rowkey。
1,先查询memstore [memstore是是一个按键排序的树形结构的缓冲区],即写内存是否存储rowkey数据,如果有就返回,没有进行第二步查询;
2,查询区域服务器的读缓存BlockCache是​​否存在rowkey对应数据,如果有就返回,没有的话就行进行第三步查询
.3,在HFile里面根据rowkey查询数据,不管有没有都返回到客户端。
这个就是普通查询,但是布隆过滤器不一样。
布隆过滤器是根据自己的算法计算不同的存储文件中是否有该rowkey【这里不用去纠结其中的算法是什么】,判断过程:1。计算该hfile中是否有该rowkey,如果存在则返回true【这里的真代表可能存在,因为这个布隆过滤器有百分之一的错误率】,然后在依次的遍历该storefile中所有数据,如果在hfile中依次查找但是不存在则返回no; 2 。如果算法计算中没有这个rowkey,则返回没有证明没有该数据。
这里需要注意的是:布 过滤器有百分之一的错误率,但是该错误率只针对于真正的错误率,若返回没有则证明的确不存在。

深入原理:
1,主要功能
提高随机读的性能
2,存储开销
bloom filter的数据存在StoreFile的meta中,一旦写入无法更新,因为StoreFile是不可变的.Bloomfilter是一个列族(cf)级别的配置属性,如果你在表中设置了布隆过滤器,那么HBase的会在生成StoreFile时包含一份布隆过滤器结构的数据,称其为元区块;元区块与数据块(真实的KEYVALUE数据)一起由LRUBlockCache维护所以,开启布隆过滤器会有一个的存储及内存缓存开销 
.3,控制粒度
a)ROW
根据KeyValue中的行来过滤storefile 
举例:假设有2个storefile文件sf1和sf2, 
sf1包含kv1(r1 cf:q1 v),kv2(r2) cf:q1 v) 
sf2包含kv3(r3 cf:q1 v),kv4(r4 cf:q1 v) 
如果设置了CF属性中的bloomfilter为ROW,那么得(r1)时就会过滤sf2,get(r3)就会过滤sf1 
b)ROWCOL
根据KeyValue中的行+限定符来过滤storefile
举例:假设有2个storefile文件sf1和sf2, 
sf1包含kv1(r1 cf:q1 v),kv2(r2 cf:q1 v) 
sf2包含kv3(r1 cf:q2 v),kv4(r2 cf:q2 v) 
如果设置了CF属性中的布隆过滤器为ROW,无论得到(R1,Q1)还是得到(R1,Q2),都会读取SF1 + SF2;而如果设置了CF属性中的布隆过滤器为ROWCOL,那么GET(R1, q1)就会过滤sf2,get(r1,q2)就会过滤sf1
c)NO
默认的值,默认不开启布隆过滤器
.4,常用场景
a)根据键随机读时,在StoreFile级别进行过滤
b ,读数据时,会查询到大量不存在的密钥,也可用于高效判断密钥是否存在
5,优缺点
布隆过滤器的优点:空间效率和查询时间都远远超过一般的算法,布隆过滤器存储空间和插入/查询时间都是常数O(k)。另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格。场合的优势有 
布隆过滤算率的英文其中器的缺点:误之一随着存入的元素数量增加,误算率随之增加但是如果元素数量太少,则使用散。列表足矣。 (误判补救方法是:再建立 个小的白名单,存储那些可能被误判的信息。) 
另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位数组变成整数数组,每插入一个元素相应的计数器加1,这样删除元素时将计数器减掉就可以了。然而要保证安全地删除元素并非如此简单。首先我们必须保证删除的元素在布隆过滤器里面。这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。 

代码:
在创建表时加入一个参数就可以了。

hbase 布隆过滤器_第1张图片

你可能感兴趣的:(hbase)