HBase读取流程概述

目录

一、流程概述

1、根据rowkey定位到对应的RegionServer的目标region

2、构造三层Scanner Iterator体系,

3、过滤不满足条件的Scanner,即过滤不满足条件的HFile或者MemStore

4、每个Scanner(可能在MemStore也可能在HFile中)执行seek得到startKey

5、对所有的Scanner合并构建成最小堆,依次pop取出有小到大排列的KeyValue,

6、前五步相当于构建一个未过滤的迭代器,下一步就是执行next取出目标的KeyValue,执行过滤逻辑,过滤完返回给客户端

二、关键节点串联

整体逻辑:

Scanner构造成最小堆并通过pop得到KeyValue集合流程:

HDFS获取HBase的目标DataBlock流程:


一、流程概述

1、根据rowkey定位到对应的RegionServer的目标region

        1.1、通过客户端缓存的rowkey和RegionServer的映射信息定位目标RS和region
        1.2、客户端找不到的话从zk上的/hbase-root/meta-region-server节点获取保存HBase元数据表hbase:meta所在的RegionServer
        1.3、客户端与保存元数据的RS通讯,查找rowkey对应的RS和region信息

2、构造三层Scanner Iterator体系

RegionScanner、StoreScanner、MemStoreScanner和StoreFileScanner,实际通过MemStoreScanner和StoreFileScanner分别对MemStore和HFile进行数据的查找

3、过滤不满足条件的Scanner,即过滤不满足条件的HFile或者MemStore

通过TimeRange过滤、RowKey过滤、布隆过滤器过滤淘汰掉不必要搜索的数据文件或MemStore

4、每个Scanner(可能在MemStore也可能在HFile中)执行seek得到startKey

5、对所有的Scanner合并构建成最小堆,依次pop取出有小到大排列的KeyValue,

在取KeyValue数据的时候,按如下取数据
        5.1、如果是从HFile取数据,先从HFile的Load-on-open部分记录的的根索引节点根据二分法定位到叶子索引Block节点,中间可能还需要通过二分法定位到一个中间索引块,再进一步定位叶子索引节点,最多3层索引结构
        5.2、整体取数据流程:A:Root Index Block--》B:Intermediate Level Data Index Block--》C:Leaf Index Block--》D:Data Block
        5.3、加载内存的IO操作:A打开HFile就加载的,不计,其他的B、C、D都是需要加载到内存的,共3次IO
        5.4、在C-->D获取DataBlock的时候,可能通过两个方式获取数据:
            5.4.1、【查找缓存】通过BlockCache查找是否有对应Block,有的话按指定偏移量和大小的数据直接返回,没有则去HDFS查找
            5.4.2、【查找HDFS】HDFS查找目标Block的指定偏移量和大小的数据
            5.4.2.1、NN根据索引提供的信息查找有哪些HDFSBlock
            5.4.2.2、NN根据找到的HDFSBlock,找到对应的DataNode列表,数据块在HDFS中默认是3份副本,按本地最优原则返回目标DataNode给HBase
            5.4.2.3、HBase与对应的DataNode通讯,读取目标偏移量和大小的数据返回

6、前五步相当于构建一个未过滤的迭代器,下一步就是执行next取出目标的KeyValue,执行过滤逻辑,过滤完返回给客户端

6.1、如果包含Deleted/DeleteColumn/DeleteFamily则跳到下一列
        6.2、如果KeyValue的TimeStamp不在用户设定时间TimStamp范围内,则忽略
        6.3、如果KeyValue不满足用户设置过滤条件,则忽略
        6.4、如果KeyValue不满足用户所选版本,则忽略     

二、关键节点串联

整体逻辑:

rowkey --》RegionServer(1到N个region)--》三层Scanner Iterator体系--》Scanner构造成最小堆并通过pop得到KeyValue集合--》KeyValue过滤逻辑--》目标数据集合

Scanner构造成最小堆并通过pop得到KeyValue集合流程

Root Index Block--》Intermediate Level Data Index Block -》Leaf Index Block--》Data Block

HDFS获取HBase的目标DataBlock流程

NN--》HDFSBlock列表--》DataNode列表--》多个目标DataNode(本地优先)--》HDFSBlock中包含目标偏移量和大小的数据
    
    
   参考:https://blog.csdn.net/JacksonKing/article/details/107688783

你可能感兴趣的:(HBase,设计原理)