在hbase中,布隆过滤器是打开的,这个布隆过滤器主要的目的是为了方便检索region,减少磁盘i/o的操作。举个案例来说明hbase是如何应用布隆过滤器的:
写操作
当有数据发生写入的时候,首先我们会去找需要把这个数据写入哪个region里面的哪个文件里面,首先会根据region的起始位置确定写入哪个region文件,然后再这个region里面有很多的HFile和Block块,最终数据要确定写入哪个Block块,所以这么多文件我们就没法去挨个遍历了。在hbase中,这是的布隆过滤器就起作用了,他能告诉客户端给定的key是否存在于某个文件中。如果存在于当前文件,则写入这个文件中,如果不存在,则直接跳过这个文件。
由此可以看到他可以跳过很多的文件,不需要做过多的I/O操作,可以迅速的定位文件位置进行写数据。
读操作
这里的读操作和写操作是一样的,都是可以告诉客户端给定的key是否存在于某个文件中。直接从存在的文件中获取对应的值。
备注:
1、布隆过滤器有缺陷,他的原理其实主要还是hash,是hash就会发生碰撞,所以可能存在当前文件没有对应的key,但是布隆过滤器会返回true,认为当前文件存在对应的key。但是布隆过滤器绝对不会把没有这个key的文件返回true。 2、在hbase中,布隆过滤器是默认打开的。
最后在hbase中布隆过滤器在hbase.xml中相关的配置项有:
序号 | 配置项 | 默认值 | 描述 |
1 | io.storefile.bloom.enabled | yes | 设置是否发生异常的时候kill掉布隆过滤器 |
2 | io.storefile.bloom.error.rate | 0.1 | 布隆过滤器发生错误误报率的百分比 |
3 | io.storefile.bloom.max.fold | 7 | 布隆过滤最大的折叠率,此值一般不用管 |
4 | io.storefile.bloom.max.keys | 128000000 | 布隆过滤器的块 |
5 | io.storefile.delete.family.bloom.enabled | true | 删除族布隆过滤器”并将其存储在StoreFile中 |
6 | io.storefile.bloom.block.size | 131072 | 目标Bloom块大小。大约这个大小的布隆滤波器块与数据块交错。 |
7 | hfile.block.bloom.cacheonwrite | false | 为复合Bloom筛选器的内联块启用写缓存。 |
布隆过滤器在很多地方都有很好的使用,他是一种可以节省空间快速判断是否存在与不存在的搞笑的工具。
还没有评论,来说两句吧...