一、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