hbase的Region分裂代码分析
region分裂有2种触发情景:1是用户手动触发(参见HRegionServer的splitRegion方法),2是后台flush线程flush完一个region的memstore时,会去检查这个region是否需要分裂(参见MemStoreFlushe的flushRegion方法)。这两种情景在代码实现上并无多大差异。
, firstKey.length) < 0) {
再来看一下openDaughters
- void openDaughters(final Server server,
- final RegionServerServices services, HRegion a, HRegion b)
- throws IOException {
- //并行打开两个daughters
- DaughterOpener aOpener = new DaughterOpener(server, a);
- DaughterOpener bOpener = new DaughterOpener(server, b);
- aOpener.start();
- bOpener.start();
- if (services != null) {
- try {
- services.postOpenDeployTasks(b, server.getCatalogTracker(), true); // compact有references的storefile,compact操作最终清理掉这些reference文件,并把实际文件的内容写到region中去。将regioninfo信息和location的位置信息put到.META.表中
- services.addToOnlineRegions(b); //添加region对象到regionserver的online列表中,终于可以对外提供服务了
- services.postOpenDeployTasks(a, server.getCatalogTracker(), true);
- services.addToOnlineRegions(a);
- } catch (KeeperException ke) {
- throw new IOException(ke);
- }
- }
- }
最后梳理下整个流程:
检查该region是否需要分裂,如果满足分裂条件,则通过region.checkSplit()拿到midkey,并把该分裂请求SplitRequest提交给后台的CompactSplitThread线程池去执行,SplitRequest内部会创建SplitTransaction来实现分裂,其过程如下:
* 根据该region和midkey创建两个新的region对象HRegionInfo,代表分裂后的两个dautghter region
* 在zk上创建一个临时节点(名称为“/hbase/region-in-transition/region-name”的znode),以防regionserver在分裂过程中down掉,保存split状态为RS_ZK_REGION_SPLITTING,表示开始region分裂。同时因为master一直watch znode(/hbase/region-in-transition),所以master会知道这个region的变化,以防master对其进行move等操作
* 在该region所在的hdfs路径下创建.splits文件夹
* 关闭该region,关闭前会等待region的flush和compact都完成(通过writestate同步实现),还会判断如果memstore的size小于5m(默认)时,会preFlush,然后关闭该region,region停止读写,并从regionserver的online服务中移除
* 通过创建与该region下storefile个数相同的线程池子进行storefile的并行分裂,见StoreFileSplitter的splitStoreFile方法,其核心走StoreFile.split方法,其生成类型为reference的storefile文件,比如encode name为a,column family为cf(该cf下有名为hfile的storefile)的region分裂后会形成名为b和c的引用文件,此时在hdfs中该region下的目录结构为
/hbase/tableName/a/cf/hfile
/hbase/tableName/b/.splits/cf/hfile.a
/hbase/tableName/c/.splits/cf/hfile.a
这两个引用文件的storefile的内容由原storefile的中间rowkey和range组成,reference文件的个数与原split region的storefile文件个数相同
* 在.META.表中下线split的region,修改.META.表的该region信息,把offline split设置为true,添加列:splitA和splitB
* 并行打开两个daughters region,CompactSplitThread后台线程会compact有references的storefile,compact操作最终清理掉这些reference文件,把实际文件的内容写到daughters region中去。并将daughter region的regioninfo信息和location的位置信息put到.META.表中
* 添加region对象到regionserver的online列表中,终于可以对外提供服务了
转载请注明出处:http://blog.csdn.net/odailidong/article/details/42217439
参考文章:
http://blog.csdn.net/c77_cn/article/details/38758545
http://www.cnblogs.com/foxmailed/p/3970050.html
hbase的Region分裂代码分析的更多相关文章
- HBase之五:hbase的region分区
一.Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成.对象层级图如下: Table (HBase table) Region (Regions for the ...
- 【转帖】HBase之五:hbase的region分区
HBase之五:hbase的region分区 https://www.cnblogs.com/duanxz/p/3154487.html 一.Region 概念 Region是表获取和分布的基本元素, ...
- hbase的region
一.Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成.对象层级图如下: Table (HBase table) Region (Regions for the ...
- region split流程分析
region split流程分析 splitregion的发起主要通过client端调用regionserver.splitRegion或memstore.flsuh时检查并发起. Client通过r ...
- HBase 与 Cassandra 架构对比分析的经验分享
架构对比 HBase和Cassandra几乎是一个年份发起,又都是在2010年成为Apache的顶级项目,不过如果我们去细品其内部机制,我们会发现其实两者是完全不同的架构风格. HBASE起源于Goo ...
- STM32启动代码分析 IAR 比较好
stm32启动代码分析 (2012-06-12 09:43:31) 转载▼ 最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...
- hbase删除region块的脚本
删除hbase表region块脚本 文件hua.txt格式: CHAT_INFO,1318153079100530000314050,1318173760068.991ca04ff164c3f7987 ...
- Hive metastore整体代码分析及详解
从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结.那么我们先打开metadata的目录,其目录结构: 可以看到,整个hivemeta的目录 ...
- 微信公众号抢现金红包活动的核心代码分析(asp.net C#)
今年春节微信抢红包,我想各位都还记得.最近很多商家也在使用公众号给粉丝发红包,做营销活动.吸粉活动或者是反馈老用户等. 我们作为第3方开发者,就义不容辞的来给这些商家服务了.首先我们得会使用程序来写抢 ...
随机推荐
- 最小生成树(II)与Kruskal算法
为防止网页加载过慢,故分两章.上接https://www.cnblogs.com/Uninstalllingyi/p/10479470.html Kruskal算法——将森林合并成树 玩过瘟疫公司吗… ...
- 剑指offer-从上往下打印二叉树22
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom( ...
- Asp.net之数组应用
string[] abc=new string[8]{"1","2","3","4","1",&qu ...
- 1.linux环境配置
首先说一下,这里是虚拟机环境. 1.用vbox安装centos6.8-mini 注意不要使用复制的方式安装,复制的虚拟机网络不通 安装如下: 主机 ip 角色 内存 hadoop1 192.168.0 ...
- 关于docker 基础使用记录
Docker Hub地址:https://hub.docker.com Docker Hub 存放着 Docker 及其组件的所有资源.Docker Hub 可以帮助你与同事之间协作,并获得功能完整的 ...
- ChromeSwitchySharp代理设置步骤
步骤: 1.新增情景模式配置如下: 2.设置切换规则 3.先“直接连接”进行登录:然后切换到“自动切换模式”访问对应url
- NSDate常用的日期操作
// 当前时间创建NSDate NSDate *myDate = [NSDate date]; NSLog(@"myDate = %@",myDate); //从现在开始的24小时 ...
- 解决打包遇到的_mssql问题
明明上一篇还说着打包好了,这一个又出现了问题,真是让人揪心呀!错误如下: Traceback (most recent call last): File "macc.py", li ...
- YaoLingJump开发者日志(四)
这么有意思的游戏没有剧情怎么行?开始剧情的搭建. 用到了LGame中的AVGScreen,确实是个好东西呢,只需要准备图片和对话脚本就行了. 经过不断的ps,yy,ps,yy,游戏开头的剧 ...
- 【week2】 累计进度条、psp、饼图
每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间 2016年9月9日 读书 构建之法-5.6章 19:00 20:00 0 60min 2016年9月10日 看博客 ...