我的编程空间,编程开发者的网络收藏夹
学习永远不晚

hbase中的位图索引--布隆过滤器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

hbase中的位图索引--布隆过滤器

   在hbase中,读业务是非常频繁的。很多操作都是客户端根据meta表定位到具体的regionserver然后再查询region中的具体的数据。

   但是现在问题来了,一个region由一个memstore以及多个filestore组成,memstore类似缓存在服务器内存中,可以提高插入的效率,当memstore达到一定大小(由hbase.hregion.memstore.flush.size设置)或者说用户手动flush之后,就会固化存储在hdfs之类的磁盘系统上。也就是说一个region可以对应很多有着有效数据的文件,虽然文件内的数据是按照rowkey进行排序的,但是文件之间的rowkey并没有任何顺序(除非经过一次major_compact合并为一个文件)。

   如果用户现在提出的请求是查看一个rowkey(row1)的随意某个列(cf1:col1)

   即使用 get 'tab','row1','cf1:col1'这样命令

   很有可能的一种现象是,row1在每个文件的startkey以及endkey之间,因此regionserver需要扫描每个文件的相关数据块,进行多次物理IO。可是并不能确保每个文件中一定有row1这样的行健,很多物理IO都是无效的,这样以来对性能就有很大的影响。于是乎就有了布隆过滤器,在一定程度上判别文件中是否有指定的行健。

   布隆过滤器分为row以及rowcol两种,原理差不多,以rowcol类型为例:

   在memstore写入到hdfs形成文件时,文件内有一个部分叫做meta,在写入的过程中遵循如下算法:

    1.首先会初始化一个比较长的bit数组不妨叫做bit arr[n]={0};

    2.利用k个hash函数(k<n),对单个(row:cf:col)这样的数据进行k次hash运算,保证计算结果在[0,n-1]之间;

    3.假设某个hash函数的运算结果为r,则设置arr[r]=1,这样每个(row:cf:col)差不多都可以有k个结果,并将arr数据相应位置设置为1;

    4.如此反复知道所有的数据都被写入文件,然后将arr写入文件中的meta部分

   由于位图索引本身的结构特点,可以保证arr[n]不会很大;所以即使被缓存到内存中(不是memstore)也不会占用太大空间,虽然在关系型数据库中,尤其是oltp系统,位图索引会造成大量锁现象,但是在hbase中,已经写入的文件除非compact否则几乎不会修改。

   现在再来看 get 'tab','row1','cf1:col1',在判断某个文件是否含有(row1:cf1:col1)时,只需要将row1:cf1:col1进行k个hash运算,并判断是否每个结果对应的arr数组值是不是1,如果有一个不是,则可以表明文件中不存在这一列数据(当然即使全部都是1也不一定代表就有),这样可以避免读不必要的文件,提高查询效率。

   从上可见布隆过滤器可以在一定程度上避免读不必要的文件,可是由于是基于hash函数的,所以也不能说是完全准确的,而且对于大规模的scan这样的操作,完全没有必要使用布隆过滤器。

                        2017.1.15




免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

hbase中的位图索引--布隆过滤器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++位图,哈希切分与布隆过滤器怎么应用

本篇内容主要讲解“C++位图,哈希切分与布隆过滤器怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++位图,哈希切分与布隆过滤器怎么应用”吧!一、位图1、位图的概念所谓位图,就是用每一位
2023-07-05

Redis中Bloomfilter布隆过滤器的学习

布隆过滤器是一个非常长的二进制向量和一系列随机哈希函数的组合,可用于检索一个元素是否存在,本文就详细的介绍一下Bloomfilter布隆过滤器,具有一定的参考价值,感兴趣的可以了解一下
2022-12-14

Redis中Bloom filter布隆过滤器的学习

目录1.概念2.guava实现2.1.依赖2.2.初始化布隆过滤器2.3.布隆过滤器2.4.添加元素或者判断是否存在3.Redisson实现3.1.依赖3.2.注入或测试1.概念​ 布隆过滤器是一个高空间利用率的概率性数据结构,主要目的是
2022-12-14

C++哈希应用之位图,哈希切分与布隆过滤器详解

这篇文章主要为大家详细介绍了C++哈希应用中的位图、哈希切分与布隆过滤器,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
2023-05-14

Java中的布隆过滤器你真的懂了吗

经常会听到大家说起布隆过滤器,但是很多人都只是听过名字,却并不知道其是怎么实现的。下面将详细介绍一下布隆过滤器,并且使用简单的代码演示
2023-05-18

Java中的布隆过滤器原理实现和应用

Java中的布隆过滤器是一种基于哈希函数的数据结构,能够高效地判断元素是否存在于一个集合中。它广泛应用于缓存、网络协议、数据查询等领域,在提高程序性能和减少资源消耗方面具有显著优势
2023-05-17

MySQL的索引与HBase的Bloom Filter在数据过滤中的协同作用

MySQL的索引与HBase的Bloom Filter在数据过滤中各自扮演着不同的角色,它们之间并没有直接的协同作用,因为MySQL和HBase是两种不同的数据库系统,它们的数据存储和处理方式有着本质的区别。以下是它们在数据过滤中的作用的介
MySQL的索引与HBase的Bloom Filter在数据过滤中的协同作用
2024-10-22

PHP数据结构:布隆过滤器的巧用,实现高效的集合检索

布隆过滤器是一种空间效率高的数据结构,用于判断元素是否属于集合。它使用哈希函数和位数组来高效地查找是否存在该元素,可能会出现假阳性。它适用于需要快速检索大量元素的场景,如url重复检测。PHP 数据结构:巧用布隆过滤器,实现高效集合检索简
PHP数据结构:布隆过滤器的巧用,实现高效的集合检索
2024-05-15

编程热搜

目录