【HBase】Apache HBase内核深度剖析( 四 )

  • Trailer:这部分主要记录了HFile的基本信息、各个部分的偏移值和寻址信息 。
  • 对于一个HFile文件来讲 , 最终落盘到磁盘上的时候会将一个大的HFile拆分成多个小文件 , 每一个叫做block块 , 和HDFS的块相似 , 每一个都可以自己重新设定大小 , 在HBase里面默认为64KB , 对于较大的块 , 在SCAN的时候可以在连续的地址上读取数据 , 因此对于顺序SCAN的查询会非常高效 , 对于小块来讲则更有利于随机的查询 , 所以块大小的设置 , 也是HBase的调参的一个挑战 , 相关的定义在源码里面使用的HFileBlock类中 , HFileBlock的结构如下所示:
    【HBase】Apache HBase内核深度剖析
    本文插图

    (HFileBlock结构 , 来自网络)
    每一个block块支持两种类型 , 一种是支持Checksum的 , 一种是不支持Checksum的 , 通过参数usesHBaseChecksum在创建block的时候进行设置:
    【HBase】Apache HBase内核深度剖析
    本文插图

    HFileBlock主要包含两个部分 , 一个是Header一个是Data , 如下图所示:
    【HBase】Apache HBase内核深度剖析
    本文插图

    (HFileBlock结构 , 来自网络)
    BlockHeader主要存储block元数据 , BlockData用来存储具体数据 。 前面提到一个大的HFile会被切分成多个小的block , 每一个block的header都相同 , 但是data不相同 , 主要是通过BlockType字段来进行区分 , 也就是HFile把文件按照不同使用类型 , 分成多个小的block文件 , 具体定义在BlockType中 , 定义了支持的Type类型:
    【HBase】Apache HBase内核深度剖析
    本文插图

    下面我们仔细分解一下HBase的Data部分的存储 , HBase是一个K-V的数据库 , 并且每条记录都会默认保留 , 通过时间戳进行筛选 , 所以HBase的K-V的格式在磁盘的逻辑架构如下所示:
    【HBase】Apache HBase内核深度剖析
    本文插图

    (DataBlock结构 , 来自网络)
    每个KeyValue都由4个部分构成 , 而Key又是一个复杂的结构 , 首先是rowkey的长度 , 接着是rowkey , 然后是ColumnFamily的长度 , 再是ColumnFamily , 之后是ColumnQualifier , 最后是时间戳和KeyType(keytype有四种类型 , 分别是Put、Delete、 DeleteColumn和DeleteFamily) , 而value相对简单 , 是一串纯粹的二进制数据 。
    最开始的时候我们介绍了布隆过滤器 , 布隆过滤器会根据条件减少和跳过部分文件 , 以增加查询速度:
    【HBase】Apache HBase内核深度剖析
    本文插图

    (布隆过滤器 , 来自网络)
    每一个HFile有自己的布隆过滤器的数组 , 但是我们也会发现 , 这样的一个数组 , 如果HBase的块数足够多 , 那么这个数组会更加的长 , 也就意味着资源消耗会更多 , 为了解决这个问题 , 在HFile里面又定义了布隆过滤器的块 , 用来检索对应的Key需要使用哪个数组:
    【HBase】Apache HBase内核深度剖析
    本文插图

    (布隆过滤器结构 , 来自网络)
    一次get请求进来 , 首先会根据key在所有的索引条目中进行二分查找 , 查找到对应的Bloom Index Entry , 就可以定位到该key对应的位数组 , 加载到内存进行过滤判断 。
    HBase RegionServer 聊完了HBase的流程和存储格式 , 现在我们来看一下HBase的RegionServer , RegionServer是HBase响应用户读写操作的服务器 , 内部结构如下所示:


    推荐阅读