一、什么是merge region

region的merge和split相对应。
当一个region变得数据量特别大,已经影响到读写时,就会把一个region分裂成若干个。
对应merge,region的merge就是将多个region合并成一个。

二、什么情况下要merge region

当一个table数据量比较小,但是region数量特别多时,就需要merge region。
量化多大?当你发现很多绝大多数region体积都在几十MB以下时(小于1G),而且比例很多。

什么情况下会造成region数量比较多?

  • 当创建表时数据量估算失败,预分区明显大于数据量,每个region只分配了几MB的数据量。
  • hbase集群关闭了major_compact,一个table删除了大量的数据,但是一直没有执行major_compact。
    这时你发会发现count数据量很小,但是表的hdfs目录下面数据体积特别大。此时需要手动执行以下major_compact,然后发现体积变小了,但是region没有降下来,此时就需要merge region。

三、怎么merge region

在hbase shell里面执行命令,就可以在线手动热合并
合并分区时,第三个参数千万别设置为“true”,否则你就要详细地看下第四个标题“翻车记录”

hbase(main):001:0> merge_region

Examples:

  hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'
  hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME', true


hbase(main):002:0>

命令后面接两个region的id,region的id在hbase页面上可以看到。

合并region时,一般是对表的多个region进行合并,所以要进入到table的region页面选取region进行合并。

合并region的原则是合并相邻的region。 为什么这样做下面会讲到。

hbase 格式 hbase region_merge region


例如:

hbase(main):002:0> merge_region 'c6a66e3d6534bdc036593b278f387c1c','9ef976c7103ba0fc68a5f803ab898fbc'
0 row(s) in 0.2410 seconds

hbase(main):003:0>

四、merge region翻车记录

合并分区时,第三个参数千万别设置为“true”,假如你设置为了true,恰好你又合并了两个不相邻的region,这是你打开hbase shell,count下全表,来个全表扫描,count可能会卡到某个rowkey就执行不下去,卡住。

为什么会这样?
存储在hbase中的数据,rowkey都是按照顺序排的,例如从1排到9,相邻的region也是按照顺序排列。
每个region都有一个start key和end key,相邻region的start key和end key都相连。
假如中间region错乱,出现排序覆盖,例如下面这种情况

#合并前的3个region
region1  start_key:110  end_key:111
region2  start_key:111  end_key:112
region3  start_key:112  end_key:113

#将两个不相邻的region1和region3合并,变为region0,start_key变为110,end_key变为113,如下
region0  start_key:110  end_key:113
region2  start_key:111  end_key:112

上面这种情况region1和region3,强制合并可以合并在一起,合并后发现region0的start_key和end_key覆盖住了region2的start_key和end_key。正常情况相邻region的start_key和end_key是相连的,这种情况就违背了hbase的原则,查询时hbase就会卡住。

怎么修复?
了解是因为几个region的start key和end key相互覆盖导致的,我们可以是用hbase自带的修复工具来修复覆盖region。

#修复覆盖分区
hbase hbck -fixHdfsOverlaps 'your table name'
#修复后修复分离出的分区
hbase hbck -fixHdfsHoles 'your table name'