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会被清除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase的数据存储在Region,每个Region负责一段连续的key范围。当一个Region的数据量过大或者key范围过于分散时,需要进行Region的拆分或合并操作。 ## Region拆分 Region拆分可以将一个过大的Region分割成两个或多个相对较小的Region,以便更好地管理和利用硬件资源。 ### 触发条件 当一个Region的数据量超过了hbase.hregion.max.filesize(默认为1GB)或者key范围过于分散时,会触发Region拆分操作。 ### 操作过程 1. HBase会在Region拆分点(split point)处选择一个新的Region作为拆分后的Region之一,同时将原有Region的数据分配到拆分后的两个Region。 2. HBase会将拆分点及其前面的数据都分配给新的Region,将拆分点后面的数据留在原有的Region。 3. HBase会将拆分点及其前面的数据范围作为新Region的key范围,将原有Region的key范围修改为拆分点后面的数据范围。 ### 操作示例 假设有一个Region的key范围为[a,c),数据量为1.5GB,超过了hbase.hregion.max.filesize,需要进行拆分操作。 1. HBase会选择一个拆分点(split point),例如选择b作为拆分点。 2. HBase会创建一个新的Region,key范围为[b,c),同时将[a,b)范围内的数据分配给新的Region,将[c,∞)范围内的数据留在原有的Region。 3. HBase会将[a,b)范围作为原有Region的key范围,将[b,c)范围作为新Region的key范围。 ## Region合并 Region合并可以将相邻的两个Region合并为一个Region,以便更好地利用硬件资源。 ### 触发条件 当相邻的两个Region的数据总量小于hbase.hregion.max.filesize(默认为1GB)且key范围连续时,会触发Region合并操作。 ### 操作过程 1. HBase会选择相邻的两个Region进行合并,将它们的数据合并到一个新的Region。 2. HBase会将两个Region的key范围合并为一个key范围。 ### 操作示例 假设有两个相邻的Region,key范围分别为[a,b)和[b,c),数据总量小于hbase.hregion.max.filesize,需要进行合并操作。 1. HBase会将两个Region的数据合并到一个新的Region,key范围为[a,c)。 2. HBase会将两个Region的key范围合并为[a,c)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值