HBase是如何实现存储和读取优化的

简介

本文将介绍下HBase的存储优化和检索优化。重点介绍下什么是布隆过滤器,以及如何选型和使用。

一.存储优化

利用[MemStore](https://blog.csdn.net/x541211190/article/details/108387698和WAL预写日志实现数据顺序快速插入,降低延迟,利用了LSM树的多级存储原理。

这里只做个总结,具体和点击上面的关键字跳转到对应文章中做详细实现了解。

二.使用布隆过滤器(BloomFilter)做检索优化

1.什么是布隆过滤器?

布隆过滤器是一个很长的二进制矢量和一系列随机的异常函数。

布隆过滤器的作用是什么?

用于检索一个元素是否在一个集合中。

布隆过滤器的优点和缺点是什么?

优点:空间效率和查询时间都远远超过一般的算法;

缺点:是有一定的误识别率和删除困难。

布隆过滤器是如何实现快速查找的?

通过一种多哈希函数的快速查找算法,通常用于某个元素是否属于某个集合,但对准确度不要求100%正确。它通常是判断一个元素"是否不在"一个集合中。

例:判断集合{x,y,z}中是否包含x元素?

解析:

HBase是如何实现存储和读取优化的_第1张图片

(布隆过滤器的哈希函数校验图)

1.先初始化位数组,将每位都设置为0;

2.再通过3个(n个函数,数量不固定)哈希函数,依次将{x,y,z}集合中的3个元素进行映射,每次映射得到一个值(即x元素可产生3个值在位数组上),这个值对应位数组上一个点,并将该点的值置为1。

3.然后将x元素以同样的方式,通过哈希函数映射到位数组上的三个点。若这3个点其中有一个点的值不为1,则x元素一定不在集合中(强判断)。若三个点都为1,则x可能存在于集合中(刚好x的三个点在位数组上都为1)。

HBase中BloomFilter的使用注意的地方

1.HBase在随机读的过程中使用布隆过滤器可以提高性能,对顺序读却没有多大影响。

2.布隆过滤器是一个列族级别的配置属性,若在表中设置了布隆过滤器,则HBase会在生成StoreFile的时候,包含一份BloomFilter的索引。

3.开启布隆过滤器会有一定的存储和内存开销,HFlle越大,BloomFilter的位数组就越长,占用的空间就越大;当大到一定程度,就不适合加载到内存中,HFile会将位数组按RowKey进行拆分,部分连续的Key使用同一个位数组,所以HFile中就包含了多个位数组。查询时,先根据Key查询到对应的某个位数组,仅将该位数组加载到内存中进行过滤,减少内存使用。

2.布隆过滤器类型

①.行类型(Row)
根据Key-Value中的RowKey来过滤StoreFile。用于列族和列都相同,只有RowKey不同的情况,来进行过滤。

使用场景: 若只有行键,则设置此过滤比较好;大部分情况设置为Row过滤器。

②.行列型(RowCol)
通过RowKey和列描述符Qualifier来过滤StoreFile。用于列族相同,列和RowKey不同的情况,来进行过滤。

使用场景: 只对指定列的随机读取有效。若仅指定行键,没有指定Qualifier,设置RowCol无效。

注意: RowCol并非Row的一种扩展,这是两种不同的类型。

HBase是如何实现存储和读取优化的_第2张图片

(StoreFile中的key-Value结构图)

例:使用RowCol时,若获取上图中的r1(rowKey)和q1(列),则会过滤掉StoreFile2;若获取r3和q2,则会过滤掉StoreFile1。

总结

本文讲解了HBase存储和读取的优化策略,重点讲解了布隆过滤器,这在其他关系型数据库是不存在的一种过滤方式。更多HBase资料,请阅读和关注HBase专栏中的其他文章。

你可能感兴趣的:(HBase,HBase优化,HBase存储优化,HBase检索优化,BloomFilter,布隆过滤器)