1. 程式人生 > >HBase最佳實踐之Region數量&大小

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.upperLimit * 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的數量&大小指標!!!