作者:zhanwang | 来源:互联网 | 2023-09-03 19:41
一、merge_region的操作目的合并region主要是为了减少HBaseMaster的元数据管理代价。二、merge_region的操作BothMasterandRegi
一、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 jsonif __name__ == '__main__':HMasterIP = '' #设置HBase restful API Server的IPHMasterPort = '' #设置HBase restful API Server的端口HBaseTableName = '' #设置表名,需要包含namespacepre_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 = 0for 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 + 1pre_region_id = region_idprint 'Region no:', i