業務場景:
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合並
這些都是之前存到有道上了,搬到這里費了好大的勁,還得不斷學習,哈哈