HBase最佳實踐 | 合理的Region數量與大小

Region數量

通常較少的region數量可使羣集運行的更加平穩,官方指出每個RegionServer大約100個regions的時候效果最好,理由如下:

  • HBase的一個特性MSLAB,它有助於防止堆內存的碎片化,減輕垃圾回收Full GC的問題,默認是開啓的。但是每個MemStore需要2MB(一個列簇對應一個寫緩存memstore)。所以如果每個region有2個family列簇,總有1000個region,就算不存儲數據也要3.95G內存空間。

  • 如果很多region,它們中Memstore也過多,內存大小觸發Region Server級別限制導致flush,就會對用戶請求產生較大的影響,可能阻塞該Region Server上的更新操作。

  • HMaster要花大量的時間來分配和移動Region,且過多Region會增加ZooKeeper的負擔。

  • HBase讀入數據進行處理的mapreduce程序,過多Region會產生太多Map任務數量,默認情況下由涉及的region數量決定。

所以,如果一個HRegion中Memstore過多,而且大部分都頻繁寫入數據,每次flush的開銷必然會很大,因此我們也建議在進行表設計的時候儘量減少ColumnFamily的個數。每個region都有自己的MemStore,當大小達到了上限(hbase.hregion.memstore.flush.size,默認128MB),會觸發Memstore刷新。

計算集羣region數量的公式:

((RS Xmx) * hbase.regionserver.global.memstore.size) / (hbase.hregion.memstore.flush.size * (# column families))

假設一個RS有16GB內存,那麼16384*0.4/128m 等於51個活躍的region。如果寫很重的場景下,可以適當調高hbase.regionserver.global.memstore.size,這樣可以容納更多的region數量。

建議分配合理的region數量,根據寫請求量的情況,一般20-200個之間,可以提高集羣穩定性,排除很多不確定的因素,提升讀寫性能。監控Region Server中所有Memstore的大小總和是否達到了上限(hbase.regionserver.global.memstore.size * hbase_heapsize,默認 40%的JVM內存使用量),超過可能會導致不良後果,如服務器反應遲鈍或compact風暴。

Region大小

HBase中數據一開始會寫入memstore,滿128MB(看配置)以後,會flush到disk上而成爲storefile。當storefile數量超過觸發因子時(可以配置),會啓動compaction過程將它們合併爲一個storefile。對集羣的性能有一定影響。而當合並後的storefile大於max.filesize,會觸發分割動作,將它切分成兩個region。

  • 當hbase.hregion.max.filesize比較小時,觸發split的機率更大,系統的整體訪問服務會出現不穩定現象。

  • 當hbase.hregion.max.filesize比較大時,由於長期得不到split,因此同一個region內發生多次compaction的機會增加了。這樣會降低系統的性能、穩定性,因此平均吞吐量會受到一些影響而下降。

hbase.hregion.max.filesize不宜過大或過小,經過實戰,生產高併發運行下,最佳大小5-10GB!關閉某些重要場景的HBase表的major_compact!在非高峯期的時候再去調用major_compact,這樣可以減少split的同時,顯著提供集羣的性能,吞吐量、非常有用。

注意通過HBase的UI控制檯都可以監控到region的數量&大小指標!!!

往期推薦  點擊標題可跳轉

1、實時數倉 | 你想要的數倉分層設計與技術選型

2、HBase實踐 | HBase內核優化與吞吐能力建設

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章