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


那么在RegionServer的写入阶段会发生什么呢?首先我们知道 , HBase是具有锁的能力的 , 也就是行锁能力 , 对于HBase来讲 , HBase使用行锁保障对同一行的数据的更新要么都成功要么都失败 , 所以在RegionServer阶段 , 会经过以下步骤:

  1. 申请行锁 , 用来保障本次写入的事务性
  2. 更新LATEST_TIMESTAMP字段 , HBase默认会保留历史的所有版本 , 但是查询过滤的时候始终只显示最新的数据 , 然后进行写入前提条件的检查:

【HBase】Apache HBase内核深度剖析
本文插图

以上相关操作的代码都在HRegion , RegionAsTable中 , 可以以此作为入口去查看 , 所以这里就不贴大部分的代码了 。
  1. 写入WAL日志文件 , 在WALProvider中定义了两个方法:

【HBase】Apache HBase内核深度剖析
本文插图

append用来对每一次的写入操作进行日志追踪 , 因为有事物机制 , 所以HBase会将一次操作中的所有的key value变成一条日志信息写入日志文件 , aync用来同步将该日志文件落盘到HDFS的文件系统 , 入场中间发生失败 , 则立即回滚 。 4. 写入Memstore , 释放锁 , 本次写入成功 。
所以可以看到对于HBase来讲写入通过日志文件再加Memstore进行配合 , 最后HBase自身再通过对数据落盘 , 通过这样一系列的机制来保障了写入的一套动作 。
讲完了HBase的写入操作 , 再来看看HBase的读取流程 。
对于读来讲 , 客户端的流程和写一样 , HBase的数据不会经过Master进行转发 , 客户端通过Master查找到元信息 , 再根据元信息拿到meta表 , 找到对应的Region Sever直接取数据 。 对于读操作来讲 , HBase内部归纳下来有两种操作 , 一种是GET , 一种是SCAN 。 GET为根据rowkey直接获取一条记录 , 而SCAN则是根据某个条件进行扫描 , 然后返回多条数据的过程 。 可以看到GET经过一系列的判断 , 例如检查是否有coprocessor hook后 , 直接返回了存储数据集的List:
【【HBase】Apache HBase内核深度剖析】【HBase】Apache HBase内核深度剖析
本文插图

那么我们再看SCAN就不那么一样了 , 可以看到 , 对于SCAN的操作来讲并不是一次的返回所有数据 , 而是返回了一个Scanner , 也就是说在HBase里面 , 对于Scan操作 , 将其分成了多个RPC操作 , 类似于数据的ResultSet , 通过next来获取下一行数据 。
【HBase】Apache HBase内核深度剖析
本文插图

HBase文件格式前面讲了HBase的操作流程 , 现在我们看下HBase的存储机制 , 首先HBase使用的HDFS存储 , 也就是在文件系统方面没有自身的文件管理系统 , 所以HBase仅仅需要设计的是文件格式 , 在HBase里面 , 最终的数据都是存储在HFile里面 , HFile的实现借鉴了BigTable的SSTable和Hadoop的TFile , 一张图先展示HFile的逻辑结构:
【HBase】Apache HBase内核深度剖析
本文插图

(HFile文件格式-图来自网络)
可以看到HFie主要由四个部分构成: