其他分享
首页 > 其他分享> > hbase lsm 树 与bloom过滤器

hbase lsm 树 与bloom过滤器

作者:互联网

Hash 索引机制

Hash索引机制支持增删改及随机读写操作,复杂度是O(1),对查询非常友好。但总所周知Hash是无序的,如果需要有序的数据,那么它便无能无力

B+树

它是一颗横跨内存与磁盘的树,树的子节点可以精确的找到某一个值。但数据在逻辑上是连续的,物理上是不连续的。

比如:有可能1,2在树上靠的非常近,但当需要从磁盘读取数据,说不定一个在一端,磁盘需要扫描一圈才能走到下一个值

所以它对初期读取数据是非常友好,但当数据越来越多时,可能读取性能就会下降。主要原因就数据在磁盘上不是顺序写入的,而是随机写入。

LSM树

日志结构合并数据

特点

优化方法

BloomFilter

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EorwAttU-1615719438612)(assets/image-20201211012226844.png)]

原理:

不准确:

可能存在两个rowkey三个hash函数计算的hash的值,可能刚好覆盖的六个位置。

然后当第三个不存在的rowkey计算的三个hash值是前两个rowkey的其中三个位置拼凑的

什么意思:如上图,Z 这个数据的hash结果是在两个蓝色块和一个黄色(姑且叫黄色吧)块

所以bloomfilter过滤器是有不准确率的,bit数组越大,减少hash冲突,不准确率越低。

BloomFilter的结果表示:不存在那么一定不不存在,存在还是需要二分法扫描

HBase中的Bloomfilter的类型及使用

ROW:根据KeyValue中的row来过滤storefile。
举例:假设有2个storefile文件sf1和sf2,
sf1包含kv1(r1 cf:q1 v)、kv2(r2 cf:q1 v)
sf2包含kv3(r3 cf:q1 v)、kv4(r4 cf:q1 v)

如果设置了CF属性中的bloomfilter为ROW,那么get(r1)时就会过滤sf1,get(r3)就会过滤sf2

ROWCOL:根据KeyValue中的row+qualifier来过滤storefile。
举例:假设有2个storefile文件sf1和sf2,
sf1包含kv1(r1 cf:q1 v)、kv2(r2 cf:q1 v)
sf2包含kv3(r1 cf:q2 v)、kv4(r2 cf:q2 v)

如果设置了CF属性中的bloomfilter为ROW,
无论get(r1,q1)还是get(r1,q2),都会读取sf1+sf2;
而如果设置了CF属性中的bloomfilter为ROWCOL,那么get(r1,q1)就会过滤sf2,get(r1,q2)就会过滤sf1

ROWCOL一定比ROW效果好么?

答案:不一定
a、ROWCOL只对指定列(Qualifier)的随机读(Get)有效,如果应用中的随机读get,只含row,而没有指定读哪个qualifier,那么设置ROWCOL是没有效果的,这种场景就应该使用ROW。
b、如果随机读中指定的列(Qualifier)的数目大于等于2,在0.90版本中ROWCOL是无效的,而在0.92版本以后,HBASE-2794对这一情景作了优化,是有效的(通过KeyValueScanner#seekExactly)
c、如果同一row多个列的数据在应用上是同一时间put的,那么ROW与ROWCOL的效果近似相同,而ROWCOL只对指定了列的随机读才会有效,所以设置为ROW更佳。

引用:https://zhuanlan.zhihu.com/p/135371171

标签:q1,r1,get,lsm,cf,ROWCOL,hbase,bloom,ROW
来源: https://blog.csdn.net/HanJuly9569/article/details/114798134