業務場景:
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界面,每隔一段時間就會需要較長的處理時間
解決過程:
【1】
首先把一些業務不需要的表disable掉,region下線,最後還剩2.5萬個線上region,随後CDH頁面無異常資訊了,并且streaming處理時間都比較正常了(四類業務表現都相同)
【2】
由于業務上每月都會有新表,是以以上的操作不能滿足,經過研究,可以在保證表的請求量不高的情況下,把目前表的region合并,進而減少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合并