内容简介:本篇重点:1.Region的切分点是整个region中最大store中的最大文件中最中心的一个block的首个rowkey。2.Region分裂是个事务过程
本篇重点:
1.Region的切分点是整个region中最大store中的最大文件中最中心的一个block的首个rowkey。
2.Region分裂是个事务过程
3.Region会先标记,在MajorCompaction时才真正移动数据。
Region切分触发策略
0.94版本~2.0版本默认切分策略是IncreasingToUpperBoundRegionSplitPolicy,一个region中最大store大小大于设置阈值就会触发切分。这个阈值在一定条件下会不断调整,调整规则和region所属表在当前regionserver上的region个数有关系 :
(#regions) * (#regions) * (#regions) * flush size * 2
当然阈值并不会无限增大,最大值为用户设置的MaxRegionFileSize。这种切分策略很好的弥补了ConstantSizeRegionSplitPolicy的短板,能够自适应大表和小表。而且在大集群条件下对于很多大表来说表现很优秀,但并不完美,这种策略下很多小表会在大集群中产生大量小region,分散在整个集群中。而且在发生region迁移时也可能会触发region分裂。 在用法上,一般情况下使用默认切分策略即可,也可以在cf级别设置region切分策略,命令为:
SplitPoint
region切分,那肯定需要一个切分点splitpoint,splitpoint是 整个region中最大store中的最大文件中最中心的一个block的首个rowkey 。所以如果定位到的rowkey是整个文件的首个rowkey或者最后一个rowkey的话,就认为没有切分点。
Region核心切分流程
Region切分是一个事务过程,分成三个阶段
-
prepare阶段:在内存中初始化两个子region,具体是生成两个HRegionInfo对象,包含tableName、regionName、startkey、endkey等。同时会生成一个transaction journal,这个对象用来记录切分的进展。
-
execute阶段:切分的核心操作,下面详解。
-
rollback阶段:如果execute阶段出现异常,则执行rollback操作。为了实现回滚,整个切分过程被分为很多子阶段,回滚程序会根据当前进展到哪个子阶段清理对应的垃圾数据,根据切分进展来做不同的回滚操作。
execute阶段详解
1. execute阶段首先regionserver 更改ZK节点 /region-in-transition 中该region的状态为SPLITING。
2. master通过watch节点/region-in-transition检测到region状态改变,并修改内存中region的状态,在master页面RIT模块就可以看到region执行split的状态信息。
3. 在父存储目录下新建临时文件夹.split保存split后的daughter region信息。
4. 关闭parent region:parent region关闭数据写入并触发flush操作,将写入region的数据全部持久化到磁盘。此后短时间内客户端落在父region上的请求都会抛出异常NotServingRegionException。
5. 核心分裂步骤:在.split文件夹下新建两个子文件夹,称之为daughter A、daughter B,并在文件夹中生成reference文件,分别指向父region中对应文件。这个步骤是所有步骤中最核心的一个环节,会生成这样的文件
除此之外,这个名为fileName.regionName的reference文件是一个引用文件(并非 linux 链接文件),存的不是数据,而是两个东西:切分点splitkey和一个boolean类型的变量(true或者false),true表示该reference文件引用的是父文件的上半部分(top),而false表示引用的是下半部分 (bottom),存了这些东西在数据真正移动的时候就可以根据regionName,HfileName,splitKey,上or下部分,这些信息定位到数据的位置。
6. 父region分裂为两个子region后,将daughter A、daughter B拷贝到HBase根目录下,形成两个新的region。这一步什么时候执行呢?compaction的执行实际上是将store中所有小文件一个KV一个KV从小到大读出来之后再顺序写入一个大文件,完成之后再将小文件删掉,因此compaction本身就需要读取并写入大量数据。子region执行 major_compaction 后会将父目录中属于该子region的所有数据读出来并写入子region目录数据文件中。可见将数据迁移放到compaction这个阶段来做,是一件顺便的事。
7. parent region通知修改 hbase.meta 表后下线,不再提供服务。下线后parent region在meta表中的信息并不会马上删除,而是标注split列、offline列为true,并记录两个子region。为什么不立马删除?实际上HMaster会启动一个线程定期遍历检查所有处于splitting状态的父region,确定检查父region是否可以被清理。检测线程首先会在meta表中揪出所有split列为true的region,并加载出其分裂后生成的两个子region(meta表中splitA列和splitB列),只需要检查此两个子region是否还存在引用文件,如果都不存在引用文件就可以认为该父region对应的文件可以被删除。
.META.Region 表信息
Region Name | Location | split | offline | splitA | splitB |
---|---|---|---|---|---|
ParentRegion | RegionServerA | true | true | DaughterA | DaughterB |
DaughterA | RegionServerA | false | false | ||
DaughterB | RegionServerA | false | false |
8. 开启daughter A、daughter B两个子region。通知修改 hbase.meta 表,正式对外提供服务。
觉得有价值请关注 ▼
以上所述就是小编给大家介绍的《HBase 篇(七):Region 的分裂》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- MongoDB sharding chunk 分裂与迁移详解
- GitLab:因“大脑分裂问题” 5台PostgreSQL 3台彻底趴下
- 人工生命 2.0.4 更新:语言的诞生和细胞分裂画小蛇
- IPv4与IPv6:互联网面临分裂吗?
- 机器学习决策树的分裂到底是什么?这篇文章讲明白了!
- 也许以后Java世界分裂为两种:Java8和Java11以后
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。