HBase

Hbase 读取流程

2021-08-30  本文已影响0人  ZYvette

Hbase 读取复杂原因:

主要基于两个方面的原因:

读流程步骤:

1. Client-Server读取交互逻辑

Client首先会从ZooKeeper中获取元数据hbase:meta表所在的RegionServer,然后根据待读写rowkey发送请求到元数据所在RegionServer,获取数据所在的目标RegionServer和Region(并将这部分元数据信息缓存到本地),最后将请求进行封装发送到目标RegionServer进行处理。

2 Server端Scan框架体系

image.png
image.png
  1. 构建Scanner Iterator体系
    1)过滤淘汰部分不满足查询条件的Scanner。
    主要过滤策略有:TimeRange过滤、Rowkey Range过滤以及布隆过滤器


    image.png

    2)每个Scanner seek到startKey

为什么HDFS的Block设计为128M,而HBase的Block设计为64K ?
1. HDFS Block 为128M,因为 主要存储文件,Block太小,会导致Block元数据(Block所在DataNode位置、文件与Block之间的对应关系等)庞大。因为HDFS元数据都存储在NameNode上,大量的元数据很容易让NameNode成为整个集群的瓶颈。
2. HBase的缓存策略是缓存整个Block,如果Block设置太大会导致缓存很容易被耗尽,尤其对于很多随机读业务,设置Block太大会让缓存效率低下。

3)KeyValueScanner合并构建最小堆
最小堆管理Scanner可以保证取出来的KeyValue都是最小的,这样依次不断地pop就可以由小到大获取目标KeyValue集合,保证有序性。

执行next函数获取KeyValue并对其进行条件过滤

1)检查该KeyValue的KeyType是否是Deleted/DeletedColumn/DeleteFamily等
2)检查该KeyValue的Timestamp是否在用户设定的Timestamp Range范围
3)检查该KeyValue是否满足用户设置的各种filter过滤器
4)检查该KeyValue是否满足用户查询中设定的版本数

总结: 读取过程中,是先根据TimeRange,Rowkey Range,bloomfilter判断数据是否在对应文件,再将文件中的数据读取出来,判断是否删除,是否符合用户条件。

读取过程总结:

  1. 客户端: 将scan 转变为多次next请求。将请求转变为发送对应region(读zk,读meta找到对应region)的请求
  2. 服务器端:过滤掉不符合查询条件的hfile,读取符合条件的hfile,构建最小堆
    (1)过滤hfile方式:TimeRange,RowKey,bloomfiler
    (2) hfile索引树定位目标block
    (3)检索block: blockcache中检索、hdfs文件中检索block
  3. 获取keyvalue,next过滤:
    (1)keytype判断是否删除
    (2)timestamp判断timerange
    (3) 判断用户filter
    (4) 判断版本号
image.png
上一篇 下一篇

猜你喜欢

热点阅读