merge_region

一、merge_region的操作目的

合并region主要是为了减少HBase Master的元数据管理代价。

 

二、merge_region的操作

Both Master and RegionServer participate in the event of online region merges. Client sends merge RPC to the master, then the master moves the regions together to the RegionServer where the more heavily loaded region resided. Finally the master sends the merge request to this RegionServer which then runs the merge. Similar to process of region splitting, region merges run as a local transaction on the RegionServer. It offlines the regions and then merges two regions on the file system, atomically delete merging regions from hbase:meta and adds the merged region to hbase:meta, opens the merged region on the RegionServer and reports the merge to the Master.

An example of region merges in the HBase shell

 

$ hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'

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

 

It’s an asynchronous operation and call returns immediately without waiting merge completed. Passing true as the optional third parameter will force a merge. Normally only adjacent regions can be merged. The force parameter overrides this behaviour and is for expert use only.

 

一般情况下不建议增加true参数“force a merge”

 

在发起merge_region之后,需要关注如下指标:

1.压缩队列

2.region数目

3.关注rit的状态

 

三、merge_region的时机

merge_region和major_compact一样,都会全量操作storefile。

但是merge_region我们选择的都是storefile大小很小的文件,因此总成的压力比major_compact要小。

 

什么情况下应该做merge_region(通过grafana:http://172.16.20.110:3000/dashboard/db/hbase-tableyun-xing-zhuang-kuang-jian-kong?orgId=1 可以看出):

1.一张表storefile总大小很小,但是region很多(多半是预分区不合理导致);

一般情况下,一个region的storefile大小在10G-50G之间,如果一个region很小,但是包含的region很多,那么就需要考虑合并region。

比如表:

gt_dw:profile_gid_app_active    大小:15G       Region数目:1321   每个region才有10M左右,明显不合理。

 

2.一张表的多个region读写很小,且region空间不大;

 

通过grafana监控可以获得每张表的平均region的大小。我们在巡检的时候发现不到1G大小的表,居然有1k+的region,这种情况应该合并。

 

四、加快region操作的办法

这里指的是快速生成merge_region命令的列表。

如果一次性需要合并1K+的region,手工拷贝将是一个非常痛苦的过程。

 

如下是用Python实现的快速生成操作命令列表的程序。

Step1:打开HBase Rest Server;

Step2:通过python语句生成merge_region的语句列表;

Step3:批量拷贝到HBase shell执行;

Step4:重复执行2和3,直到region的大小合理。

#!/usr/bin/python
# -*- coding : UTF-8 -*-
# -*- 
# v1.0
# 本文档用于生成merge_region的语句,如果有N个region,结果会返回floor(N/2),直接拷贝输入hbase shell即可,可以让region数量减少一半。

import requests
import json

if __name__ == '__main__':
    HMasterIP = ''      #设置HBase restful API Server的IP
    HMasterPort = ''    #设置HBase restful API Server的端口
    HBaseTableName = '' #设置表名,需要包含namespace
    pre_region_id = ''  # 不需要设置

    response = requests.get('http://{0}:{1}/{2}/regions'.format(HMasterIP, HMasterPort, HBaseTableName),
                            headers={"Accept": "application/json"})
    jsoncontent = json.loads(response.content)
    regioncontent = jsoncontent['Region']
    i = 0

    for region in regioncontent:
        endKey = region['endKey']
        startKey = region['startKey']
        region_str = region['name'].decode('utf8')
        region_id = region_str[len(region_str) - 33:len(region_str) - 1]
        # print region_id,startKey.ljust(80),endKey.ljust(80)
        if (i % 2 == 1):
            print "merge_region '" + region_id + "','" + pre_region_id + "'"

        i = i + 1
        pre_region_id = region_id

    print 'Region no:', i

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值