布隆过滤器及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*
布隆过滤器优缺点
优点: 具有很好的空间和时间效率(只需要哈希表的1/8或1/4的空间复杂度就能完成同样 的问题) 不存在false negative (漏报),就是说如果元素存在的话,必能得到正确的结果
缺点: 不能删除已储存的元素
元素越多,false positive rate(误报率)越大,也就说将不存在的元素判定为存在。
检查布隆过滤器看看该行是否不在这个数据块。布隆过滤器要么确定回答该行不在, 要么回答它不知道
*
布隆过滤器的代价
存储这个额外的索引层次占用额外的空间。布隆过滤器随着它们的索引对象数据增长而增长,所以行 级布隆过滤器比列标识符级布隆过滤器占用空间要少。当空间不是问题时,它们可以帮助你榨干系统 的性能潜力。
布隆过滤器及其在HBase中Fra Baidu bibliotek应用
主要内容
1 2 3
什么是布隆过滤器
布隆过滤器的Java实现
布隆过滤器在HBase中的应用
什么是布隆过滤器
布隆过滤器(Bloom Filter)是一种概率空间高效的数据结构。它与hashmap非常相似,
用于检索一个元素是否在一个集合中。它在检索元素是否存在时,能很好地取舍空间
*
谢谢 QA
为了用布隆过滤器检验元素是否存在,我们需要校验是否所有的位置都被置“1”, 与我们插入元素的过程非常相似。如果所有位置都被置“1”,那也就意味着该元素 很有可能存在于布隆过滤器中。若有位置未被置“1”,那该元素一定不存在
*
主要内容
1 2 3
什么是布隆过滤器
布隆过滤器的Java实现
布隆过滤器在HBase中的应用
如果你要查找一个短行,只在整个数据块的起始行键上建立索引无法给你细粒度的索引信息。例如, 如果你的行占用100字节存储空间,一个64KB的数据块包含(64 * 1024)/100 = 655.53 = ~700行,而你
只能把起始行放在索引位上。你要查找的行可能落在特定数据块上的行区间里,但也不是肯定存放在
① 任何类型的get(基于rowkey和基于row+col)bloomfilter都能生效,关键是get的类型要
匹配bloomfilter的类型
② 基于row的scan是没办法优化的 scan是一个范围,如果是row的bloomfilter不命中只能说明该rowkey不在此storefile中,但 next rowkey可能在。 ③ ROW + COL+qualify的scan可以去掉不存在此qualify的storefile,也算是不错的优化了, 而且指明qualify也能减少流量,因此scan尽量指明qualify。 而rowcol的bloomfilter就不一样了,如果rowcol的bloomfilter没有命中表明该qualifiy不在 这个storefile中,因此这次scan就不需要scan此storefile了
否不存在,列标识符级布隆过滤器检查行和列标识符联合体是否不存在。
ROWCOL布隆过滤器的开销高于ROW布隆过滤器。
*
布隆过滤器在如何提高GET性能
对于某个region的随机读,HBase会遍历读memstore及storefile(按照一定的顺序), 将结果合并返回给客户端。如果你设置了bloomfilter,那么在遍历读storefile时,就可 以利用bloomfilter,忽略某些storefile
*
布隆过滤器在HBase中的应用
HBase利用Bloomfilter来提高随机读(Get)的性能,对于顺序读(Scan)而言,设置 Bloomfilter是没有作用的(0.92以后,如果设置了bloomfilter为ROWCOL,对于指定
了qualifier的Scan有一定的优化,但不是那种直接过滤文件,排除在查找范围的形式)
*
ROW vs ROWCOL
ROWCOL一定比ROW效果好么?
1. 2.
ROWCOL只对指定列(Qualifier)的随机读(Get)有效,如果应用中的随机读get,只含row, 而没有指定读哪个qualifier,那么设置ROWCOL是没有效果的,这种场景就应该使用ROW 如果随机读中指定的列(Qualifier)的数目大于等于2,在0.90版本中ROWCOL是无效的,而 在0.92版本以后,HBASE-2794对这一情景作了优化,是有效的(通过 KeyValueScanner#seekExactly)
(常见的补救方法:增加一个白名单,存储可能被误判的元素)
*
布隆过滤器的空间效率
当使用列表或者集合时,空间效率都是重要且显著的,
那么布隆过滤器就应当被考虑。
*
布隆过滤器基础
布隆过滤器是N位的位数组,其中N是位数组的大小。它还有另一个参数k,表示使 用哈希函数的个数。这些哈希函数用来设置位数组的值。当往过滤器中插入元素x时, h1(x), h2(x), …, hk(x)所对应索引位置的值被置“1”,索引值由各个哈希函数计算得 到。注意,如果我们增加哈希函数的数量,误报的概率会趋近于0.但是,插入和查找 的时间开销更大,布隆过滤器的容量也会减小。
*
HBase中布隆过滤器的类型及应用
ROW, 根据KeyValue中的row来过滤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,那么get(r1)时就会过滤sf2,get(r3)就 会过滤sf1
布隆过滤器Java实现
示例: ① 为了存储一亿个电子邮件地址 ② 建立一个含有十六亿二进制比特,也就是两亿字节 ③ 将十六亿的比特全部设置为0 ④ 我们用八个不同的哈希函数,以电子邮件地址为键,算出值,有8个(也许不是数字)
⑤ 我们再一个哈希函数,分别以这8个值为键,会得到8个数值(范围为1到十六亿的某个数
3. 4.
如果同一row多个列的数据在应用上是同一时间put的,那么ROW与ROWCOL的效果近似相同,
而ROWCOL只对指定了列的随机读才会有效,所以设置为ROW更佳
ROWCOL与ROW只在名称上有联系,ROWCOL并不是ROW的扩展,不能取代ROW
*
结论
1. region下的storefile数目越多,bloomfilter的效果越好 2. region下的storefile数目越少,HBase读性能越好
个集合R,然后用元素x跟这些R中的元素一一比较来判断是否存在于集合R中;我们 可以采用链表等数据结构来实现。但是,随着集合R中元素的增加,其占用的内存将 越来越大。试想,如果有几千万个不同网页需要下载,所需的内存将足以占用掉整个 进程的内存地址空间。即使用MD5,UUID这些方法将URL转成固定的短小的字符串, 内存占用也是相当巨大的.
ROWCOL,根据KeyValue中的row+qualifier来过滤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属性中的bloomfilter为ROW,无论get(r1,q1)还是get(r1,q2),都会读取 sf1+sf2;而如果设置了CF属性中的bloomfilter为ROWCOL,那么get(r1,q1)就会过滤sf2, get(r1,q2)就会过滤sf1
*
布隆过滤器在HBase表中使用方式
hbase(main):007:0> create 'mytable', {NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}
BLOOMFILTER参数的默认值是NONE。一个行级布隆过滤器用ROW打开,列标 识符级布隆过滤器用ROWCOL打开。行级布隆过滤器在数据块里检查特定行键是
那个数据块上。这有多种情况的可能,或者该行在表里不存在,或者存放在另一个HFile里,甚至在 MemStore里。这些情况下,从硬盘读取数据块会带来IO开销,也会滥用数据块缓存。这会影响性能, 尤其是当你面对一个巨大的数据集并且有很多并发读用户时
布隆过滤器允许你对存储在每个数据块的数据做一个反向测试。当某行被请求时,先
布隆过滤器的应用
应用: 1. 垃圾邮件过滤中的黑白名单 2. 爬虫(Crawler)的网址判重模块 3. HBase ROWKEY查询
*
HBase布隆过滤器的原理
数据块索引提供了一个有效的方法,在访问一个特定的行时用来查找应该读取的HFile的数据块。但 是它的效用是有限的。HFile数据块的默认大小是64KB,这个大小不能调整太多
字) ⑥ 以上一步算出的8个数值为下标,将这8个位置的二进制都设置为1(存储了一个地址)
查询时只需要用类似的方法得到相应电子邮件的8个数值,以其为下标看二进制是否 都设置为了1,如果设置为了1,那么这个电子邮件就存在在这个表中。
*
主要内容
1 2 3
什么是布隆过滤器
布隆过滤器的Java实现
布隆过滤器在HBase中的应用
Bloomfilter是一个列族(cf)级别的配置属性,如果你在表中设置了Bloomfilter,那么HBase会在生
成StoreFile时包含一份bloomfilter结构的数据,称其为MetaBlock;MetaBlock与DataBlock(真实的 KeyValue数据)一起由LRUBlockCache维护。所以,开启bloomfilter会有一定的存储及内存cache开销
使用率与误报比例。正是由于这个特性,它被称作概率性数据结构(probabilistic data structure)
*
布隆过滤器的基本思想
Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。 计算某
元素x是否在一个集合中,首先能想到的方法就是将所有的已知元素保存起来构成一