HBase Region分裂实现
分裂策略
不同的分裂策略的实现需要继承RegionSplitPolicy,主要实现两个方法:
- shouldSplit()表示是否需要分裂
- getSplitPoint()得到分裂点rowkey
从 HBase 0.94之后,默认的分裂策略是IncreasingToUpperBoundRegionSplitPolicy
,思想就是当Region的大小超过某个阈值时,即进行分裂。
这个阈值主要由如下几个因素决定:
- hbase.hregion.max.filesize
- hbase.increasing.policy.initial.size
- 当前Region所在RegionServer上和当前Region属于同一张表的Region个数
根据以上三个因素算出一个阈值后,如果当前Region有某个Store的大小大于这个阈值,则认为该Region可分裂,这里对于Store还有一个条件就是Store下不能存在reference类型的StoreFile,这种reference类型的StoreFile是一次分裂后产生的,后续会详说。
对于IncreasingToUpperBoundRegionSplitPolicy来说,使用基类中默认的getSplitPoint()函数,即将Region中size最大的Store下最大的StoreFile拿出来,然后根据block index找出StoreFile中间的block,那么这个block的startkey就是split point
分裂实现
在后台flush线程flush完成一个region内部的memstore时,会去检查这个region是否需要分裂,如果需要分裂,会提交一个SplitRequest任务给后台的compactSplitThread线程内部的负责split的线程池,SplitRequest内部会创建一个SplitTransaction来完成split
根据待分裂region和split point生成两个HRegionInfo对象,代表分裂后产生的两个dautghter region
在zk上创建一个ephemeral node,路径是 /hbase/region-in-transition/regionEncodedName,节点内容为了通知master某个region server想split
某个region,两个子region的信息,包括range等,需要通知master原因是防止master对这个
region进行迁移等等等待master批准region server split
在hdfs上为这个region的split过程创建临时工作目录/hbase/data/namespace/tableName/regionEncodedName/.splits
关闭当前待分裂region
- 将region的writestate的writesEnabled置为false,告诉后台的compact和flush线程不要再工作了
- 如果当前region内的memstore size大于hbase.hregion.preclose.flush.size,默认5MB,那么先做一次pre flush。这里最开始时已经进行了flush region的操作,在flush region完成到现在中间可能还有写操作写入当前region内的各个store的memstore中,由于关闭region期间region不能提供读写服务,并且关闭region期间需要将region中的memstore进行flush,所以为了让region的不能提供读写服务时间变少,这里做一个pre flush,后续再真正关闭region
- 置上region的closing标记,导致region停读写。
- flush当前region的所有memstore,并且将region的所有storefile关闭
- 置上region的closed标记
- 将region从region server的online region列表中删除
开始split 当前region的store file(splitStoreFiles),为region下的每个storefile都创建一个StoreFileSplitter任务,交给线程池处理。StoreFileSplitter任务实际上没有真正的劈开
storefile,生成两个小的storefile,而是生成两个类型为reference的storefile文件,文件名和内容都比较特殊,比如:假设region encoded name为aaaa的region,分裂为两个name为bbbb和cccc的region,aaaa下有一个column family叫做cfA,下面有一个名
为hfileA的storefile,那么三个region的目录结构如下
/hbase/data/namespace/tableName/aaaa/cfA/hfileA
/hbase/data/namespace/tableName/bbbb/.splits/cfA/hfileA.aaaa
/hbase/data/namespace/tableName/cccc/.splits/cfA/hfileA.aaaa
```
从最后的hfile文件名可以看到,子region引用了父亲region的同名的hfile,这两个特殊的文件里没有真实的数据,而是一个索引数据,记着split row是什么,并且自己是split row的前半部分还是后半部分(Reference).
往两个子region的目录中写入.regioninfo文件,并且将临时目录改名,目录结构如下
/hbase/data/namespace/tableName/bbbb/cfA/hfileA.aaaa
/hbase/data/namespace/tableName/cccc/cfA/hfileA.aaaa
```
- 原子的修改meta table,在meta table里面标记父亲region下线,并且split为两个region,
并且在meta table中加入两个子region对应的项
- 打开两个子region,更新meta table,将location记录其中 - 将两个子region加入region server的online region列表中
- 请求一个compaction操作,后台的compaction操作最终会清理掉这些reference文件
- 更新zk上节点的状态,告诉master已经split完成
- 等待master删除zk节点
参考资料
https://github.com/apache/hbase/tree/0.98
HBase Region分裂实现的更多相关文章
- hbase的Region分裂代码分析
region分裂有2种触发情景:1是用户手动触发(参见HRegionServer的splitRegion方法),2是后台flush线程flush完一个region的memstore时,会去检查这个re ...
- HBase Region级别二级索引
我们会经常谈及二级索引,这是对全表数据进行另外一种方式的组织存储,是针对table级别的.如果要为HBase上的表实现一个强一致性的二级索引,那么就无法逃避分布式事务,而这一直是用户最期待的功能. 而 ...
- [HBase]region split流程
1. 简介 HBase 的最小管理单位为region,region会按照region 分裂策略进行分裂. 基于CDH5.4.2 2. 总览
- HBase Region重点剖析
Region的概念 Region是HBase数据管理的基本单位.数据的move,数据的balance,数据的split,都是按照region来进行操作的. region中存储这用户的真实数据,而为了管 ...
- 【原创】大叔问题定位分享(13)HBase Region频繁下线
问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...
- 【转】HBASE Region in Transition issue on Master UI
[From]https://community.hortonworks.com/content/supportkb/244808/hbase-region-in-transition-issue-on ...
- Hbase Region合并
业务场景: Kafka+SparkStreaming+Hbase由于数据大量的迁移,再加上业务的改动,新增了很多表,导致rerigon总数接近4万(36个节点) 组件版本: Kafka:2.1.1 S ...
- Hbase region 某个regionserver挂掉后的处理
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwoAAACdCAMAAAAjbX91AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK
- hbase region 分配方式
参与 Region 分配的重要对象 在 Region 分配过程中,起着重要作用有如下一些对象. HMaster— 是 HBase 中的 Master server ,仅有一个. HRegionServ ...
随机推荐
- Android之从TCP/IP、HTTP看Socket通信
1.概念 TCP/IP:属于传输层/网络层协议.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传 ...
- H5开发中遇到的问题及解决办法
记不得什么时候进行H5开发的学习了,只知道是从2016年8月1日开始修复Bug,计划每天把学到的东西以及遇到问题时候的解决方案都记录下来,希望自己能够坚持下去,每天积累一点,希望有所进步吧. 1.Th ...
- 任务三十九:UI组件之冻结行列表格
任务三十九:UI组件之冻结行列表格 面向人群: 有一定JavaScript基础 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容 ...
- [BJOI 2018]求和
Description 题库链接 给你一棵 \(n\) 个结点的有根树, \(m\) 次询问这棵树上一段路径上所有节点深度的 \(k\) 次方和. \(1\leq n\leq 300000,1\leq ...
- vs2010查看quartz.net 2.1.2的源码时其中一报错的解决方法
问题: 使用vs2010查看quartz.net 2.1.2的源码时,报错: ..\Quartz.NET-2.1.2\server\Quartz.Server\Quartz.Server.2010.c ...
- Express开发性能优化
1.使用浏览器缓存 在app.js里添加 var CACHETIME = 60 * 1000 * 60 * 24 * 30; app.use(express.static(path.join(__di ...
- wcf win7+iis7 异常消息为: 可能证书“CN=PmsWcfServer”没有能够进行密钥交换的私钥
原因是证书没有用户权限,解决方法: 1.开始-运行-mmc 2.添加[证书]管理单元 3.选择[证书(本地计算机)]-[个人]-[证书],右击PmsWcfServer证书-[所有任务]-[管理密钥] ...
- linux使用mail命令发送邮件
在工作中使用linux,偶尔也会需要使用mail命令来进行发邮件. 从上面的命令看,系统已经安装了mail,对些我们还需要设置一下mail,让它使用外面的邮箱进行发邮件.设置文件是 /etc/m ...
- Jade——变体的HTML
什么是jade? jade是一个模板引擎,是变体的HTML. 模板引擎就是一个库,用来解释素具渲染视图的框架,也可以叫做HTML的预处理语言. jade是Node.js的一个模板引擎,他的语法借鉴了H ...
- C#动态创建Gridview及批量插入到数据库
这里介绍两种动态创建Gridview的方法: (一).有时需要应付上头领导的检查,所以就弄一些静态的Gridview来显示数据,这种方法的优点就是不用连接数据库,比较方便,但是代码灵活性不高,所有数据 ...