- Hbase文件存储特点:
- 同一个region的文件按照列族存储,而不是按行存储;
- 也就导致了在一个Hfile文件中,存储的是一个列族的多行数据。
- Hbase系统读取数据特点:
- 通常是读取一行数据,或者是读取单个cell数据;
- 当region中存储大量数据后,列族目录下就会有大量的Hfile文件;
- 而不论是读取一行数据还是单个cell数据,首先都要通过行键在对应的region目录下查找包含有该行键信息的Hfile文件。
- 需求分析:
- 通过对上述Hbase文件存储特点和读取数据特点的分析,发现一个关键数据—行键;
- 只要能快速确认Hfile中是否包含要找的行键,就能极大提高搜索效率;
- 那么可不可以在存入数据的时候,在Hfile中创建一个集合,将每个存入的数据的行键都放入集合中,在搜索数据时,根基要找的行键遍历集合,即可知道该Hfile中是否包含需要的数据;
- 但是这样效率依然不够高,并且占用的内存也较大,故引入—>布隆过滤器;
- 布隆过滤器原理:
- 在Hfile中开辟出一个连续的1M大小的空间,以字节为单位作为分隔
- 所有字节默认值为0,形成一个长度为8,388,608的标记队列(临时叫法)
- 在Hbase写入数据时,通过存入的数据的行键,计算出其对应的hashcode值,在队列中找到该值对应的字节位置,将字节的值改为1
- 在Hbase读取数据时,将要查找的行键通过相同的hashcode算法求得hashcode值,查看每个Hfile文件的标记队列的相应位置的值
- 如果值为0,说明该Hfile文件中不包含要查找的行键的信息
- 如果值为1,则有极大可能,该Hfile文件中包含该行键的信息(哈希冲突)
- 布隆过滤器缺点:
- 哈希冲突:
- 原因:如果两个不同的行键,恰好hashcode值相同,在读取查找时,可能会造成误判
- 分析:可不做处理,在后续的读取过程中,自然会根据行键进行遍历查找,对取出的结果影响不大;如果要处理,个人人为,可以设置两个标记队列,使用不同的hashcode算法,进行标记,两个不同算法同时重复的概率非常低
- hashcode超出:
- 原因:通过行键计算出的hashcode值超出了1M队列的最大值:8388608
- 分析:在录入数据时,限制行键长度;优化hashcode算法;在队列中查找前,先做判断是否大于8388608,如果大于,把行键存到一个独立的集合中
- 哈希冲突:
- 布隆过滤器核心思想:
- 利用机器处理2进制数据的优势,机器可以通过2>>hashcode,快速找到队列的对应位置,提高效率
- 充分利用字节的特性,0为无,1为有;又利用hashcode的独特性,用最少的空间,存储了关键信息的有无信息。
相关文章
- 02-23【原创!推荐!】不了解布隆过滤器?一文给你整的明明白白!
- 02-23玩转布隆过滤器,其实很简单!
- 02-23布隆过滤器介绍以及布隆过滤器的实现
- 02-23布隆过滤器原理及使用
- 02-23什么是布隆过滤器?
- 02-23布隆过滤器
- 02-23C++海量数据处理(二):布隆过滤器(Bloom Filter)详解
- 02-23布隆过滤器(Bloom Filter)详解
- 02-23Bloom Filter 布隆过滤器
- 02-23分布式缓存击穿(布隆过滤器 Bloom Filter)