region分裂有2种触发情景:1是用户手动触发(参见HRegionServer的splitRegion方法),2是后台flush线程flush完一个region的memstore时,会去检查这个region是否需要分裂(参见MemStoreFlushe的flushRegion方法)。这两种情景在代码实现上并无多大差异。

, firstKey.length) < 0) {

  • , lastKey.length) > 0) {
  • return null;
  • }
  • }
  • /*生成类型为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文件个数相同
  • */
  • Reference r = new Reference(splitRow, range);
  • String parentRegionName = f.getPath().getParent().getParent().getName();
  • Path p = new Path(splitDir, f.getPath().getName() + "." + parentRegionName);
  • return r.write(fs, p);
  • }
  • 再来看一下openDaughters

    1. void openDaughters(final Server server,
    2. final RegionServerServices services, HRegion a, HRegion b)
    3. throws IOException {
    4. //并行打开两个daughters
    5. DaughterOpener aOpener = new DaughterOpener(server, a);
    6. DaughterOpener bOpener = new DaughterOpener(server, b);
    7. aOpener.start();
    8. bOpener.start();
    9. if (services != null) {
    10. try {
    11. services.postOpenDeployTasks(b, server.getCatalogTracker(), true); // compact有references的storefile,compact操作最终清理掉这些reference文件,并把实际文件的内容写到region中去。将regioninfo信息和location的位置信息put到.META.表中
    12. services.addToOnlineRegions(b);  //添加region对象到regionserver的online列表中,终于可以对外提供服务了
    13. services.postOpenDeployTasks(a, server.getCatalogTracker(), true);
    14. services.addToOnlineRegions(a);
    15. } catch (KeeperException ke) {
    16. throw new IOException(ke);
    17. }
    18. }
    19. }

    最后梳理下整个流程:

    检查该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分裂代码分析的更多相关文章

    1. HBase之五:hbase的region分区

      一.Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成.对象层级图如下: Table (HBase table) Region (Regions for the ...

    2. 【转帖】HBase之五:hbase的region分区

      HBase之五:hbase的region分区 https://www.cnblogs.com/duanxz/p/3154487.html 一.Region 概念 Region是表获取和分布的基本元素, ...

    3. hbase的region

      一.Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成.对象层级图如下: Table (HBase table) Region (Regions for the ...

    4. region split流程分析

      region split流程分析 splitregion的发起主要通过client端调用regionserver.splitRegion或memstore.flsuh时检查并发起. Client通过r ...

    5. HBase 与 Cassandra 架构对比分析的经验分享

      架构对比 HBase和Cassandra几乎是一个年份发起,又都是在2010年成为Apache的顶级项目,不过如果我们去细品其内部机制,我们会发现其实两者是完全不同的架构风格. HBASE起源于Goo ...

    6. STM32启动代码分析 IAR 比较好

      stm32启动代码分析 (2012-06-12 09:43:31) 转载▼     最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...

    7. hbase删除region块的脚本

      删除hbase表region块脚本 文件hua.txt格式: CHAT_INFO,1318153079100530000314050,1318173760068.991ca04ff164c3f7987 ...

    8. Hive metastore整体代码分析及详解

      从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结.那么我们先打开metadata的目录,其目录结构: 可以看到,整个hivemeta的目录 ...

    9. 微信公众号抢现金红包活动的核心代码分析(asp.net C#)

      今年春节微信抢红包,我想各位都还记得.最近很多商家也在使用公众号给粉丝发红包,做营销活动.吸粉活动或者是反馈老用户等. 我们作为第3方开发者,就义不容辞的来给这些商家服务了.首先我们得会使用程序来写抢 ...

    随机推荐

    1. Spark mlib的本地向量

      Spark mlib的本地向量有两种: DenseVctor :稠密向量 其创建方式 Vector.dense(数据) SparseVector :稀疏向量 其创建方式有两种: 方法一:Vector. ...

    2. MySql优化浅析

      优化点:合理的使用索引,可以大幅度提升sql查询效率,特别查询的表的数据量大的时候,效果明显.一.引言 公司的产品XX出行上线正式运营,随着数据量的变大,司机2000+,日订单1万+,注册乘客26W+ ...

    3. 菜鸟之路——机器学习之决策树个人理解及Python实现

      最近开始学习机器学习,以下会记录我学习中遇到的问题以及我个人的理解 决策树算法,网上很多介绍,在这不复制粘贴.下面解释几个关键词就好. 信息熵(entropy):就是信息不确定性的多少 H(x)=-Σ ...

    4. Java 单例模式探讨

      以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

    5. 第四次作业之psp

      psp 进度条 博文字数累积折线图 代码行数累积折线图 psp饼状图

    6. C++计算器项目的初始部分(第三次作业)

      C++计算器项目的初始部分 项目源文件地址:calculator 项目信息: * 项目名称:Calculator * 项目实现: * 对四则运算表达式进行拆解 * 对拆解的表达式进行简单的错误判断 * ...

    7. Java中I/O流之数据流

      Java 中的数据流: 对于某问题:将一个 long 类型的数据写到文件中,有办法吗?    转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. ...

    8. TCP系列23—重传—13、RACK重传

      一.RACK概述 RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种.前面介绍的各种基于 ...

    9. Swagger Authorization:bearer <token>

      1.添加如下代码 /** * * @SWG\SecurityScheme( * securityDefinition="Bearer", * type="apiKey&q ...

    10. The New Day

      于博毅 160809107 爱好电脑研究 选大学专业的时候,把计算机类放在了第一专业,当时从小就很喜欢计算机,以前有接触过编程但仅限于看书,并没有动手实践过,选课的时候看了一下专业课程,都是我想学的 ...