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

    最新文章

    1. mount报错: you must specify the filesystem type
    2. 初识redis数据类型
    3. spring aop 利用JoinPoint获取参数的值和方法名称
    4. Winform Textbox MultiLine和WordWrap属性的使用
    5. jQuery 插件简单模板
    6. Mina 资料
    7. Flex的正则表达式匹配速度与手工代码的比较
    8. 翻译-微服务API Gateway
    9. hadoop常用管理员命令
    10. get和eq的区别
    11. Java基础知识强化之多线程笔记03:进程与线程 和 多线程的意义
    12. Java validator整理
    13. WebApi2官网学习记录---Media Formatters
    14. wampServer 2.5 64位 更改&quot;www 目录&quot;不成功
    15. 后端路由项目由 gulp 改为 webpack 的踩坑实录
    16. [Err] ORA-00923: FROM keyword not found where expected 与rownum
    17. Java作业:第一次过程性考核 ——长春职业技术学院 16级网络工程
    18. Mybatis常见疑问
    19. POJ2421 Constructing Roads【最小生成树】
    20. 关于NLP和深度学习,准备好好看看这个github,还有这篇介绍

    热门文章

    1. Open MPI集群运行
    2. kvm网络虚拟化
    3. vue.js学习之 打包为生产环境后,页面为白色
    4. Python的top-level脚本为什么在磁盘上没有对应的字节码?
    5. 软件工程part5
    6. 总结Canvas和SVG的区别
    7. iOS- UIButton/UIImageView/UISlider/UISwitch操作
    8. lol佐伊美图
    9. oracle 删除数据恢复
    10. 用svmpredict输出的结果为空