天天看點

Hbase Region合并

業務場景:

Kafka+SparkStreaming+Hbase

由于資料大量的遷移,再加上業務的改動,新增了很多表,導緻rerigon總數接近4萬(36個節點)

元件版本:

Kafka:2.1.1

Spark:2.2.0-cdh5.12.0

Hbase:1.2.0-cdh5.12.0

問題發現:

CDH界面較多關于web伺服器相應時間過長,和隊列重新整理速度較慢。

streaming界面,每隔一段時間就會需要較長的處理時間

Hbase Region合并

解決過程:

【1】

首先把一些業務不需要的表disable掉,region下線,最後還剩2.5萬個線上region,随後CDH頁面無異常資訊了,并且streaming處理時間都比較正常了(四類業務表現都相同)

Hbase Region合并

【2】

由于業務上每月都會有新表,是以以上的操作不能滿足,經過研究,可以在保證表的請求量不高的情況下,把目前表的region合并,進而減少region數。而且Hbase叢集目前已經停掉了region自動分裂,是以不會有在合并完之後再分裂的情況。

禁用分裂機制:

Hbase Region合并

叢集配置:

Hbase Region合并

理論上講,現在regionserver配置設定了64G記憶體,0.8的寫入高水位線,也就是64*0.8=51.2G用作寫,每個memstore占用128M,這麼算的話理論上也就每個server400多個region的時候,不會造成過早的flush,總共下來400*36個,現在已經是超負荷運作了,是以還需要将Region進行合并。

合并代碼:

public class Hbase_Merge {

public static void main(String[] args) throws Exception {

Configuration conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.property.clientPort", "2181");

conf.set("hbase.zookeeper.quorum", "zk1,zk2,zk3");

HBaseAdmin admin = new HBaseAdmin(conf);

List<HRegionInfo> regions = admin.getTableRegions(TableName.valueOf("TableName"));

Collections.sort(regions, new Comparator<HRegionInfo>() {

@Override

public int compare(HRegionInfo o1, HRegionInfo o2) {

return Bytes.compareTo(o1.getStartKey(),o2.getStartKey());

}

});

HRegionInfo regionInfo =null;

for (HRegionInfo r : regions){

int index =regions.indexOf(r);

if(index %2 == 0){

regionInfo = r;

}else{

System.out.println("start to merge two regions,NUM:"+index+" and "+(index+1) );

admin.mergeRegions(regionInfo.getEncodedNameAsBytes(),r.getEncodedNameAsBytes(),false);

System.out.println("merge two regions finished");

}

}

System.out.println("merge all regions finished");

}

}

結果:

最終Region數大量減少,Streaming任務也恢複正常。

後記:

IO高峰為合并region導緻的,入Hbase的程式都将受到影響,Streaming批處理時間增長,中間還伴随着Region-In-Transition(此處影響不大)

建議:避開業務高峰期對Region合并

Hbase Region合并

繼續閱讀