Apache HBase 写数据过程

HBase写数据详细过程

  1. Client先访问zookeeper,找到Meta表,并获取Meta表元数据。根据Meta表元数据,确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。
  2. Client向该HRegionServer服务器发起写入数据请求,然后HRegionServer收到请求并响应。
  3. Client先把数据写入到HLog,以防止数据丢失,然后将数据写入到Memstore。如果HLog和Memstore均写入成功,则这条数据写入成功
  4. 如果Memstore达到阈值,会把Memstore中的数据flush到Storefile中。
  5. 当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的Storefile。
  6. 当Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二。

细节描述:

hbase使用MemStore和StoreFile存储对表的更新。

数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并 且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时,系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了。

当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。

StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。

当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(minor_compact, major_compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行split,等分为两个StoreFile。

由于对表的更新是不断追加的,compact时,需要访问Store中全部的 StoreFile和MemStore,将他们按row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,合并的过程还是比较快。

HBase支持修改,但本质上只是数据的追加,所以是伪修改

笔记:

Apache HBase 写数据过程
1、Client先访问zookeeper,找到Meta表,并获取Meta表元数据。确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。

2、Client向该HRegionServer服务器发起写入数据请求。
2.1 Client先把数据写入到HLog,以防止数据丢失。
2.2 然后将数据写入到Memstore。

3、Memstore达到阈值,会把Memstore中的数据flush到Storefile中

4、当Storefile越来越多,达到一定数量时,会触发Compact合并操作,将多个小文件合并成一个大文件。

5、Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,变成两个文件。

说明:hbasez 支持数据修改(伪修改),实际上是相同rowkey数据的添加。hbase只显示最后一次的添加。