分裂策略

不同的分裂策略的实现需要继承RegionSplitPolicy,主要实现两个方法:

  1. shouldSplit()表示是否需要分裂
  2. getSplitPoint()得到分裂点rowkey

从 HBase 0.94之后,默认的分裂策略是IncreasingToUpperBoundRegionSplitPolicy

,思想就是当Region的大小超过某个阈值时,即进行分裂。

这个阈值主要由如下几个因素决定:

  1. hbase.hregion.max.filesize
  2. hbase.increasing.policy.initial.size
  3. 当前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分裂实现的更多相关文章

  1. hbase的Region分裂代码分析

    region分裂有2种触发情景:1是用户手动触发(参见HRegionServer的splitRegion方法),2是后台flush线程flush完一个region的memstore时,会去检查这个re ...

  2. HBase Region级别二级索引

    我们会经常谈及二级索引,这是对全表数据进行另外一种方式的组织存储,是针对table级别的.如果要为HBase上的表实现一个强一致性的二级索引,那么就无法逃避分布式事务,而这一直是用户最期待的功能. 而 ...

  3. [HBase]region split流程

    1. 简介 HBase 的最小管理单位为region,region会按照region 分裂策略进行分裂. 基于CDH5.4.2 2. 总览

  4. HBase Region重点剖析

    Region的概念 Region是HBase数据管理的基本单位.数据的move,数据的balance,数据的split,都是按照region来进行操作的. region中存储这用户的真实数据,而为了管 ...

  5. 【原创】大叔问题定位分享(13)HBase Region频繁下线

    问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...

  6. 【转】HBASE Region in Transition issue on Master UI

    [From]https://community.hortonworks.com/content/supportkb/244808/hbase-region-in-transition-issue-on ...

  7. Hbase Region合并

    业务场景: Kafka+SparkStreaming+Hbase由于数据大量的迁移,再加上业务的改动,新增了很多表,导致rerigon总数接近4万(36个节点) 组件版本: Kafka:2.1.1 S ...

  8. Hbase region 某个regionserver挂掉后的处理

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwoAAACdCAMAAAAjbX91AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK

  9. hbase region 分配方式

    参与 Region 分配的重要对象 在 Region 分配过程中,起着重要作用有如下一些对象. HMaster— 是 HBase 中的 Master server ,仅有一个. HRegionServ ...

随机推荐

  1. redis报Cannot allocate memory错误

    昨天16:27开始将dp的日志使用ELK处理,当时redis使用内存的量不是很大,100M多点,结果今天早上到了一看xshell被关掉了,赶紧将各服务启动起来,elasticsearch启动没有问题, ...

  2. System.Windows.Forms.Timer的简单用法

    Timer就是用来计时操作,如:你想在多少秒之后执行某个动作 Timer showTextBoxTimer = new Timer(); //新建一个Timer对象 showTextBoxTimer. ...

  3. 复刻smartbits的国产网络测试工具minismb-如何测试ip限速

    复刻smartbits的网路性能测试工具MiniSMB,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数和最 ...

  4. layer相关使用

    父子页面传参数 转自:https://blog.csdn.net/babyxue/article/details/76854106 1.父页面打开子页面并向子页面传参数 function setCho ...

  5. Eclipse内存讲解,eclipse.ini设置

    Ubuntu 系统下,Eclipse 配置文件: vi ~/eclipse/eclipse.ini -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:Max ...

  6. HTML5中Access-Control-Allow-Origin解决跨域问题

    www.111cn.net 更新:2015-01-07 编辑:flyfox 来源:转载 跨域在开发中一些是一个比较常见的问题虽然有json或者xml来解决,现在html5开始流行了,我们可以通过Acc ...

  7. Oracle存储过程中调用DBLink同义词出现错误:PLS-00201: 必须声明标识符

    前几天编写一个存储过程,需要访问远程数据库的字段,于是建立一个dbLink并建了同义词: CREATE PUBLIC DATABASE LINK orcl@dbc CONNECT TO orcl ID ...

  8. js 背景自动切换

    //首页自动更换背景特效开始============================================ var curIndex = 0; //时间间隔(单位毫秒),每秒钟显示一张,数组 ...

  9. 关于PLSQL启动用时较长的问题解决

    问题: 打开登陆界面缓慢. 解决: 1.删除控制面板中的打印机 2.将打印机改为手动并停止启动状态 .

  10. Syntax error on token "Invalid Regular Expression Options", no accurate corr

    今天导入项目一个js文件报这个错 Syntax error on token "Invalid Regular Expression Options", no accurate c ...