HBase的写/读流程

1、写流程

写流程图

假设客户端client需要写入put 'table','rowkey1','cf1:column1','value',具体写流程如下:

  1. Client先访问zookeeper,请求和获取hbase:meta表位于哪个Region Server(图中为hadoop002);
  2. 访问对应的Region Server,获取hbase:meta表,根据写请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该tableregion信息以及meta表的位置信息缓存在客户端的meta cache,以便下次访问;
  3. 与目标Region Server(hadoop002)进行通讯;
  4. 将数据顺序写入(追加)到Wal
  5. 将数据写入对应的MemStore,数据会在MemStore进行排序;
  6. 向客户端发送ack
  7. 等达到MemStore的刷写时机后,将数据刷写到HFile

上面提到的刷写,是由HBase自己完成,客户端的读流程在收到ack后就已经完成。下面简单介绍MemStore的刷写:内存的数据会根据所在的Region,刷写到HDFS中实际存储的文件中,如下图所示。

内存写到HFile

2、读流程

读流程图

假设客户端client需要读 get 'table','rowkey1',具体读流程如下:

  1. Client先访问zookeeper,请求和获取hbase:meta表位于哪个Region Server(图中为hadoop002);
  2. 访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标位于哪个Region Server中的哪个Region中。并将该tableregion信息以及meta表的位置信息缓存在客户端的meta cache,以便下次访问;
  3. Region Server(hadoop002)进行通讯,发送get请求;
  4. 分别在Bolock Cache(读缓存),MemStoreStore File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(根据timeStamp判定)或者不同的类型(Put/delete);
  5. 将从文件中查询到的数据块(Block,HFile数据存储单元,默认大小为64kb)缓存到Block Cache
  6. 将合并的最终结果返回给客户端。

读文件就涉及到了文件合并(StoreFile Compaction)的问题,由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(根据timeStamp分)和不同类型(put/delete)又可能分布在不同的HFile中,因此查询时需要遍历所有的HFile。为了减少HFile的个数,以及清除过期和删除的数据,会进行StoreFile Compaction。
Compaction分为两种,分别为Minor CompactionMajor Compaction
(1) Minor Compaction会将临近的若干个较小的HFile合并为一个较大的HFile,但不会清理过期和删除的数据。
(2) Major Compaction会将一个Store下的所有HFile合并成一个大的HFile,并且会清理过期和删除的数据。
文件合并的流程如下图所示。

HFile合并

你可能感兴趣的:(HBase的写/读流程)