HBase StoreFile的实现分析

StoreFile是hbase中的数据文件,HBase中memestore的每次flush都会形成一个storefile文件。我们知道HBase中的数据索引是按照LSM tree组织起来的,简单来说,LSM tree就是一系列的B+ tree组织起来,对应着每个storefile就是一棵B+ tree。本文主要分析StoreFile中的Reader和Writer的实现,并简要分析storefile中数据是如何组织成一个B+ tree,欢迎大家一起讨论学习,本文长期更新。

基本知识:

常用的数据库比如Oracle都是采用B+树组织的数据索引,在一颗B+树中,只有最底层节点(叶子节点)才保存信息,其它节点(根节点&中间节点)用来索引找到正确的数据节点。每个叶子节点都有前指针和后指针,用于提高范围查询的效率,避免再去回溯至中间节点或者根节点。

当数据量增多时,B+树的缺点便会显现出来,随着新数据的增多,叶子节点慢慢分裂,逻辑上相邻的节点在物理上往往是不连续的,这样造成了大量的随机读写I/O。为克服B+树的缺点,提出了LSM tree的概念,LSM就是把一颗大树拆分成数棵小树,写入的数据首先会写入到内存中并在内存中构造成一颗小树,当小树增大时会flush到磁盘上。由于数据是顺序写入内存的,因此随机写的性能得到了提高。

StoreFile中Reader的调用路径:

1、StoreFile.Reader这个类初始化的时候会初始化一个 HFile.Reader的对象,调用HFile.createReader方法;
2、createReader方法调用pickReaderVersion依据HFile的版本选择不同的HFile.Reader构造函数;
3、pickReaderVersion中的主要代码片段如下:



我们以HFileReaderV2为例,分析他的构造函数,看看这个类中都初始化了哪些变量,HFileRaderV3继承了这个类,构造方法类似:



这一块是创建了HFile的上下文。



接着是与创建index相关的动作。

在HFileV2中所有的索引按树状组织,只让顶层索引常驻内存,其它索引按需载入内存并按照LRU算法进行更新,这样避免了将所有索引全部载入内存造成的浪费。
         
HFile中的index根据数据类型和数据大小有不同的选择,主要可以分为两类:一类是单级(single-level)索引,另一类是多级(multi-level)索引。
     两者的区别在于单级索引由root直接指向block,root index-> xxx_block,而多级索引则引入了intermediate_index 和 leaf_index ,可能的索引结构如下所示:
                              root index-> intermediate_index -> leaf_index -> data_block

从上述的代码片段中可以看到HFile的元信息采用单级索引,而数据信息采用的多级索引。

回到StoreFile,接下来分析StoreFile.Writer这个内部类:

同样地,StoreFile.Writer中有一个内部成员变量HFile.Writer用于具体对Hfile的写操作。同样地以HFileWriterV2为例分析HFile.Writer都提供了哪些可用接口,以及写入HFile中需要注意的知识点。

HFileWriterV2中使用了HFileBlock.Writer类型的变量,HFileWriterV2暴露给外面使用的主要写方法就是append,关于append函数的意义,hbase给了很好的解释:



在append中实际上调用了上面说到的HFileBlock.Writer变量,调用了它提供的write方法将key/value数据写入到file文件中,也就是说每个HFile文件是划分成了多个Block,每个Block存在一个索引指向它在磁盘中的位置。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值