hbase之布隆过滤器

一、布隆过滤器

布隆过滤器(Bloom Filter)是1970由布隆提出的。通过一个很长的二进制向量于一系列随即哈希函数生成。下面我就将通过以下小节来介绍布隆过滤器:

1、原因与结构解析

2、数学公式

1.1 原因与结构解析

首先,我们应当知道,hash是内存中使用的经典数据结构。

当我们需要判读一个元素是否在一个集合当中时,我们可以用哈希表来判断。在集合较小的情况下,hash是可行而且高效的。

然而数据量以PT计的大数据场景中,很多时候,hash便力有未逮。这是因为在海量数据下hash要占据巨额内存空间,这远远超过我们能够提供的内存大小。

例如在黑名单过滤当中,我们有100亿的网站黑名单url需要过滤,假设一个url是64bytes。如果我们用hash表来做,那么我们至少需要6400亿字节即640G的内存空间(实际所需空间还远大于此),空间消耗巨大,必须要多个服务器来同时分摊内存。

然而我们是否能用更加精简的结构来做这件事呢?布隆过滤器就是这样一个高度节省空间的结构,并且其时间也远超一般算法,但是布隆过滤器存在一定的失误率,例如在网页URL黑名单过滤中,布隆过滤器绝不会将黑名单中网页查错,但是有可能将正常的网页URL判定为黑名单当中的,它的失误可以说是宁可错杀,不可放过。不过布隆过滤器的失误率可以调节,下面我们会详细介绍。

布隆过滤器实际就是一种集合。假设我们有一个数组,它的长度为L,从0-(L-1)位置上,存储的不是一个字符串或者整数,而是一个bit,这意味它的取值只能为0或1.

例如我们实现如下的一个数组:

int[] array = new int[1000];

该数组中有1000个int类型的元素,而每一个int由有4个byte组成,一个byte又由8个bit组成,所以一个int就由32个bit所组成。

所以我们申请含1000整数类型的数组,它就包含32000个bit位。

但是我们如果想将第20001个bit位描黑,将其改为1,我们需要怎样做呢。

首先我们的需要定位,这第20001个bit位于哪个整数,接着我们需要定位该bit位于该整数的第几个bit位。

### 如何在ElasticSearch中实现使用布隆过滤器 #### 使用背景 布隆过滤器可以在数据库全文索引系统(如HBase、Elasticsearch)中用于加速查询操作。通过帮助快速判断某个键是否存在于存储系统的特定分区或索引文件内,可以有效减少不必要的磁盘I/O操作[^1]。 对于Elasticsearch而言,在某些版本里内置支持了布隆过滤器的功能,主要用于优化分片级别的文档存在性检查。然而需要注意的是,官方已逐渐弃用了此特性,并建议开发者考虑其他替代方案来达到相似的效果。 尽管如此,仍可以通过插件或其他方式间接引入并利用布隆过滤器的优势: - **安装第三方插件**:部分社区贡献者开发了兼容新版本ES的布隆过滤器插件; - **外部集成服务**:构建独立的服务层处理布隆过滤器逻辑并与ES交互; #### 实现方法概述 假设采用第二种途径即建立单独的服务来进行布隆过滤器管理,则具体流程如下所示: 1. 创建一个独立于Elasticsearch运行的服务实例负责维护布隆过滤器状态; 2. 当接收到新的记录时,更新该服务中的布隆过滤器结构; 3. 查询阶段先访问这个额外设立的服务询问目标ID是否存在可能性; 4. 如果得到否定答复,则可断定对应条目确实不存在于后端ES集群之中从而避免发起实际查找请求;反之则继续执行标准检索过程。 ```java // Java伪代码展示如何调用可能存在的外部布隆过滤器API接口 public boolean shouldQueryEs(String id){ // 调用远程HTTP API 或 gRPC 接口向布隆过滤器服务器发送查询请求 Boolean mightContain = bloomFilterServiceClient.mightContain(id); return mightContain; } ``` 上述做法不仅适用于Elasticsearch环境下的性能改进措施,同样也能应用于任何需要高效排除不可能命中的场景下。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值