HBase Region Split过程详解

 1、检查是否需要进行Region Split的时机:

每次flush或者compact之后,regionserver都会去检查是否满足了Split的条件。

2、Region Split的过程如下:

 

HBase Region Split过程详解_第1张图片

(1)RegionServer在Zookeeper上创建一个/hbase/region-in-transition/region-name结点,并设置结点的内容为SPLITTING 

(2)由于Master监听/hbase/region-in-transition,所以(1)发生时,Master会收到相应的通知。

(3)RegionServer在HDFS上的parent’s region 目录下创建一个.splits目录

(4)RegionServer关闭ParentRegion,同时强制执行flush操作,并在RegionServer的本地数据结构中将该Region标记为offline状态。此时当客户端再请求该ParentRegion时,会抛出NotServingRegionException的异常,客户端会不断的进行尝试。

(5)RegionServer在.splits目录下创建daughter regions A and B两个子目录,并创建对应的数据结构。然后,RegionServer开始对ParentRegion中所有StoreFile执行Split的操作。此阶段RegionServer只会为ParentRegion中的每一个StoreFile创建两个索引文件。

(6)RegionServer在HDFS上分别为daughterA Region和daughterB Region创建实际的存储目录

(7)RegionServer向.META.表发送一个Put请求。此请求首先将.META.表中的ParentRegion标记为offline,然后将daughterA Region和daughterB Region的信息添加到.META.表中。但是此时在.META.表并不存在代表daughterA和daughterB的单独实体。此时查询.META.表,我们将看到ParentRegion正在进行Split,但是看不到daughter的信息。如果RegionServer 执行Put操作执行成功,那么ParentRegion将会被成功的Split。如果RegionServer执行Put操作失败,Master和下一个打开ParentRegion的RegionServer会将关于ParentRegion的Split操作的脏数据删除掉。

(8)RegionServer打开daughterA Region和daughterB Region,然后daughter Region开始接受写请求。

(9)RegionServer将daughterA 和daughterB 的信息添加到.META.表中。之后,客户端才能够发现daughterA 和daughterB region,并向daughter Region发送请求。

(10)RegionServer 将zookeeper上的/hbase/region-in-transition/region-name结点的状态更新为SPLIT,此时Master会收到状态更新的通知,然后Balanceer可以将daughter Region指定到其他的RegionServer上。

(11) Split过程结束之后,HDFS和META中还会保留着指向parent region的索引文件的信息。这些索引文件会在daughter Region执行Major Compact来对StoreFile进行重写时删除掉。Master中的Garbage collection任务会周期性的检查daughter regions中是否还包含指向parents Region的索引文件,如果不包含,Master会将parents Region删除掉。

你可能感兴趣的:(hbase)