本篇重点:

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切分策略,命令为:

  1. create ’table’, {NAME => ‘cf’, SPLIT_POLICY => ‘org.apache.hadoop.hbase.regionserver. ConstantSizeRegionSplitPolicy'}

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中对应文件。这个步骤是所有步骤中最核心的一个环节,会生成这样的文件

  1. /hbase/data/<nameSpace>/<tableName>/<regionname>/<column-family>/<filename>.<regionname>

除此之外,这个名为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篇(7)-Region的分裂相关推荐

  1. 【2022持续更新】大数据最全知识点整理-HBase篇

    大数据最全知识点整理-HBase篇 基础问题: 1.Hbase是什么 2.Hbase架构 3.Hbase数据模型 4.Hbase和hive的区别 5.Hbase特点 6.数据同样存在HDFS,为什么H ...

  2. HBase原理–所有Region切分的细节都在这里了

    转载自:http://developer.51cto.com/art/201708/549419.htm -------------------- HBase系统中Region自动切分是如何实现的? ...

  3. 【No server address listed in hbase:meta for region XX】

    hbase中出现region问题 ERROR: No server address listed in hbase:meta for region t1,,1536659773616.09db0b8b ...

  4. Zookeeper+Hadoop+Hbase+Hive+Kylin+Nginx集群搭建四(Hbase篇)

    Zookeeper+Hadoop+Hbase+Hive+Kylin+Nginx集群搭建四(Hbase篇) 五.Hbase集群搭建 1.准备工作(下载与时间同步) 2.安装解压 3.环境变量配置 4.文 ...

  5. 十万个为什么之Hbase篇

    1.为什么Hadoop可以为Hbase提供高容错性? 因为Hadoop跟Hbase都是出至于Apache基金会,Hbase建立于Hadoop之上,habse以storeFile二进制流的形式将数据存储 ...

  6. hbase的系统表、分裂、下载和上传

    hbase的分裂.上传和下载 hbase的系统表储存在命名空间为hbase中: 因为我们之前安装hbase的时候配置了hbase的存储在hdfs中的位置 所以我们在hdfs的这个目录下有关于hbase ...

  7. hbase中的region

    HBase 基本概念 1.region region 是部分数据,所以是所有数据的一个自己,但region包括完整的行,所以region 是行为单位 表的一个子集. 每个region 有三个主要要素: ...

  8. Hadoop系列六:Hadoop之HBase篇

    HBase安装和运行 1)HBase理解 HBase是一个开源的.分布式的.多版本的.面向列的存储模型.可以直接使用本地文件系统也可使用Hadoop的HDFS文件存储系统.HBase存储的数据介于映射 ...

  9. HBase架构:HLog region store memstore compact storefile

    HLog(WALlog)预写日志 write ahead log 写数据先写到日志 再写memstore hbase的快在于内存和顺序写 region 即table 一一对应 store 即cf列族 ...

最新文章

  1. 猫头鹰的深夜翻译:在JVM上根据合约编程
  2. Android 设备管理API概览(Device Administration API)
  3. android viewpager 复杂指示器_View Pager 性能优化之 无限循环
  4. IOS15.0的适配
  5. golang mysql curd_Go 语言操作 MySQL 之 CURD 操作
  6. 2018年线程与多线程面试必知必会内容
  7. 每天CookBook之JavaScript-018
  8. 软考中级软件设计师知识点总结
  9. 腾讯云短信服务的简单使用
  10. 我是 SPI,我让框架更加优雅了!
  11. 边缘之战鸣枪 新华三蓄势待发
  12. 如何申请开通个人邮箱?
  13. 微雪树莓派PICO笔记——3.PWM(脉冲宽度调制)
  14. 怎么在线快速将多张CAD图纸转换成低版本DXF格式?
  15. Linux系统:基础指令
  16. js FOR循环效率问题
  17. 我的世界天空之城服务器位置,我的世界1.7.2服务器天空之城
  18. Word中如何将英文翻译成中文?简单的方法介绍
  19. java cms 开源系统_基于Java的开源CMS系统选择
  20. Win11的两个实用技巧系列之关闭分屏模式方法

热门文章

  1. shell编程实现一些小游戏
  2. Vue-router的使用
  3. 服务器hz和显示器hz,揭秘精神论:玩电竞是否必须144Hz显示器
  4. 张小龙4个小时演讲全文:每天有1亿人教我做产品(下)
  5. 利用手机app语音控制arduino
  6. js通过localStorage实现一周/一天免登陆
  7. 贝塞尔曲线想到的--真的很美,但是有时很丑
  8. linux网卡连接失败设备无法激活
  9. php中如何过滤关键字,PHP - 过滤关键字
  10. 微信小程序(1)新闻小应用代码以及总结小程序一些知识点