HBase中Split的详细过程

分裂的细节并不简单。当分裂发生时,新创建的“女儿regions”不会将所有的数据立即写入到新文件中。相反,它创建一些与象征性引用文件相似的小文件,称为Reference files,这些文件根据根据切分点指向父store file的头部或者尾部。reference file用起来和普通数据文件没什么区别,但是其中只有一半的记录。region只会在没有引用指向父region不变的数据文件时才会真正的分裂。reference files会在compaction的时候逐渐的被清理,这时split会发生。

虽然分裂region是RegionServer的本地行为,但分裂的过程会与很多角色相关。RegionServer在split前后通知Master,更新.META.表,这样客户可以发现新的“女儿regions”,并重新整理HDFS中的目录结构与数据文件。Splitting是一个多任务的过程。为了能在发生错误时回滚,RegionServer维护了一个内存中的日志去记录执行状态。

1.RegionServer在本地决定进行region分裂,准备分裂。分裂事务开始。第一步,RegionServer取得一把该表共享的读行为锁防止在split过程中发生模式变更。然后在zookeeper中创建一个znode放在/hbase/region-in-transition/region-name,并且将这个znode的状态置为“SPLITTING”。

2.Master知道了这个znode,因为它有一个对父znode“region-in-transition”的观察器。

3.在HDFS中,RegionServer在父“region”目录下创建一个子目录“.splits”。

4.RegionServer关闭了父region并且在本地数据结构中将该region标记为离线状态。进行split的region现在处于离线状态。这时候,客户端对于父region的请求会抛出“NotServingRegionException”错误。客户端会进行重新尝试。关闭的region会被清楚。

5.RegionServer为“女儿regions”A和B在“.splits”目录下创建region目录和必须的数据结构。然后分裂store files,为每个store file创建了两个引用文件(reference file),这两个引用文件会指向父region的文件。

6.RegionServer在HDFS中创建“女儿region”真实的region目录,并且将引用文件(reference files)移入其中。

7.RegionServer发送一个Put请求给.META.表,将.META.表中的父region置为离线状态并且添加两个“女儿region”的信息。这时候,两个“女儿region”不会有独立的词目(entry)在.META.中。客户端如果对.META.表进行scan操作会发现父region被分裂,但是不知道关于“女儿region”的任何信息知道她们出现在.META.表中。另外,如果Put操作成功,父region的split将会生效。如果在这个RPC操作之前RegionServer挂了,Master和接替的RegionServer会清理关于这个region分裂操作的脏状态。直到.META.表被更新以后,region的分裂操作才会前滚。

8.RegionServer并行的开启“女儿regionA”和“女儿regionB”

9.RegionServer将“女儿region”A和B的信息添加进.META.表中。分裂的region(女儿region)这时候置为在线状态。这之后,客户端可以看到新的region并且可以向其提交请求。客户端将.META.中的词目(entry)缓存在本地,但是当他们提交请求到RegionServer或者.META.表的时候,他们的缓存将会失效,同时它们会从.META.表中看到新的region。

10.RegionServer更新ZooKeeper中znode“/hbase/region-in-transition/region-name”的状态为“SPLIT”,这样Master能获取到这个信息。如果必要的话,平衡器会把两个“儿女region”分配到其他region server上去。split事务正式结束。

11.split过后,.META.和HDFS仍然维护一个指向父region的引用。当“女儿region”发生compact(合并)重写数据文件的时候这些引用会被删除。垃圾收集器周期性的检查“女儿region”是否有指向父region文件的引用,如果没有,则父region会被清除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值