Hbase Memstore刷新方式与Region的数目上限
目錄
Region數目上限
Region大小上限
MemStore的刷新方式(觸發條件)
HLog (WAL) Size & Memstore Flush
頻繁的Memstore Flushes
Region數目上限
RegionServer的region數目取決于memstore的內存使用,每個region擁有一組memstore(memstore的數量有hstore決定,hstore的數據由創建表時的指定的列族個數決定,所以 每個region的memstore的個數 = 表的列族的個數 ),可以通過配置來修改memstore占用內存的大小,一般設置在 128 M – 256M之間。
RegionServer 分配一定比例的內存給它下面的所有memstore(?該比例大小 可通過hbase.regionserver.global.memstore.upperLimit 進行修改 ), 如果內存溢出(使用了太多的memstore),它可能會導致嚴重的后果,如服務器反應遲鈍 或compact風暴。比較好的計算每RS(假設一個表)region的數量的公式為:
((RS memory) * (total memstore fraction)) / ((memstore size)*(# column families))
即
(RegionServer內存? *??分配給MemStore比例)?/ (Memstore 大小 * 列簇數量)
| ? | 參數 | 說明 |
| 分配給MemStore比例 | hbase.regionserver.global.memstore.upperLimit | 單個Region內所有的memstore大小總和,超過則flush到磁盤 |
| Memstore 大小 | hbase.hregion.memstore.flush.size | 如 memstore 大小超過此值(字節數),Memstore 將刷新到磁盤。通過運行由 hbase.server.thread.wakefrequency 指定的頻率的線程檢查此值。 |
| ? | hbase.regionserver.global.memstore.lowerLimit | 如下 |
| ? | hbase.hregion.memstore.block.multiplier | 超過memstore大小的倍數達到該值則block所有寫入請求,自我保護 |
參數說明:
hbase.regionserver.global.memstore.upperLimit/lowerLimit
默認值:0.4/0.35
upperlimit說明:hbase.hregion.memstore.flush.size 這個參數的作用是當單個Region內所有的memstore大小總和超過指定值時,flush該region的所有memstore。RegionServer的flush是通過將請求添加一個隊列,模擬生產消費模式來異步處理的。那這里就有一個問題,當隊列來不及消費,產生大量積壓請求時,可能會導致內存陡增,最壞的情況是觸發OOM。
這個參數的作用是防止內存占用過大,當ReigonServer內所有region的memstores所占用內存總和達到heap的40%時,HBase會強制block所有的更新并flush這些region以釋放所有memstore占用的內存。
lowerLimit說明: 同upperLimit,只不過lowerLimit在所有region的memstores所占用內存達到Heap的35%時,不flush所有的memstore。它會找一個memstore內存占用最大的region,做個別flush,此時寫更新還是會被block。lowerLimit算是一個在所有region強制flush導致性能降低前的補救措施。在日志中,表現為 “** Flush thread woke up with memory above low water.”
調優:這是一個Heap內存保護參數,默認值已經能適用大多數場景。
參數調整會影響讀寫,如果寫的壓力大導致經常超過這個閥值,則調小讀緩存hfile.block.cache.size增大該閥值,或者Heap余量較多時,不修改讀緩存大小。
如果在高壓情況下,也沒超過這個閥值,那么建議你適當調小這個閥值再做壓測,確保觸發次數不要太多,然后還有較多Heap余量的時候,調大hfile.block.cache.size提高讀性能。
還有一種可能性是?hbase.hregion.memstore.flush.size保持不變,但RS維護了過多的region,要知道 region數量直接影響占用內存的大小。
hfile.block.cache.size
默認值:0.2
說明:storefile的讀緩存占用Heap的大小百分比,0.2表示20%。該值直接影響數據讀的性能。
調優:當然是越大越好,如果寫比讀少很多,開到0.4-0.5也沒問題。如果讀寫較均衡,0.3左右。如果寫比讀多,果斷默認吧。設置這個值的時候,你同時要參考?hbase.regionserver.global.memstore.upperLimit?,該值是memstore占heap的最大百分比,兩個參數一個影響讀,一個影響寫。如果兩值加起來超過80-90%,會有OOM的風險,謹慎設置。
?
hbase.hregion.memstore.block.multiplier
指單個MemStore超過?hbase.hregion.memstore.block.multiplier 的倍數,就阻止寫入操作。
當一個集群批量導入數據時,寫入速度過快導致異常可調整 hbase.hregion.memstore.block.multiplier 參數。
? ? e.g. 異常處理:https://blog.csdn.net/zhangshenghang/article/details/82621101
Memstore手動flush
hbase(main):001:0> help 'flush' Flush all regions in passed table or pass a region row to flush an individual region. For example:hbase> flush 'TABLENAME'hbase> flush 'REGIONNAME'hbase> flush 'ENCODED_REGIONNAME'hbase(main):004:0> flush 'user' 0 row(s) in 0.2640 seconds?
?
例如: 如果 一個RegionServer配置的內存是16g,使用默認配置(?hbase默認regionserver分給memstore的比例是0.4?, 默認的menstore的占用128M內存 ), 一個CF,那么這個regionServer下的region的個數大約為?16384 * 0.4 /?(128*1)?= 51個,實際測試大于這個數 一兩倍 也沒太大的問題。 一個HBase表包含一至多個region,那么表的數目上限也是可以估算出來的。
?
Region大小上限
對于生產場景中大表,最大的region大小主要是受compactions 的限制,大量大HFile的compact會降低群集性能。目前,該建議的最大region大小為10-20GB,而5-10GB是最優
?
?
MemStore的刷新方式(觸發條件)
1、hbase.hregion.memstore.flush.size
默認值 128M,單個 MemStore 大小超過該閾值就會觸發 Flush。如果當前集群 Flush 比較頻繁,并且內存資源比較充裕,建議適當調整為 256M。調大的副作用可能是造成宕機時需要分裂的 HLog 數量變多,從而延長故障恢復時間。
2、hbase.hregion.memstore.block.multiplier
默認值 4,Region 中所有 MemStore 超過單個 MemStore 大小的倍數達到該參數值時,就會阻塞寫請求并強制 Flush。一般不建議調整,但對于寫入過快且內存充裕的場景,為避免寫阻塞,可以適當調整到5~8。
3、hbase.regionserver.global.memstore.size
默認值 0.4,RegionServer 中所有 MemStore 大小總和最多占 RegionServer 堆內存的 40%。這是寫緩存的總比例,可以根據實際場景適當調整,且要與 HBase 讀緩存參數 hfile.block.cache.size(默認也是0.4)配合調整。舊版本參數名稱為 hbase.regionserver.global.memstore.upperLimit。
4、hbase.regionserver.global.memstore.size.lower.limit
默認值 0.95,表示 RegionServer 中所有 MemStore 大小的低水位是 hbase.regionserver.global.memstore.size 的 95%,超過該比例就會強制 Flush。一般不建議調整。舊版本參數名稱為 hbase.regionserver.global.memstore.lowerLimit。
5、hbase.regionserver.optionalcacheflushinterval
默認值 3600000(即 1 小時),HBase 定期 Flush 所有 MemStore 的時間間隔。一般建議調大,比如 10 小時,因為很多場景下 1 小時 Flush 一次會產生很多小文件,一方面導致 Flush 比較頻繁,另一方面導致小文件很多,影響隨機讀性能,因此建議設置較大值。
- Memstore級別限制:當Region中任意一個MemStore的大小達到了上限(hbase.hregion.memstore.flush.size,默認128MB),會觸發Memstore刷新。
- Region級別限制:當Region中所有Memstore的大小總和達到了上限(hbase.hregion.memstore.block.multiplier?*?hbase.hregion.memstore.flush.size,默認?2*?128M?=?256M),會觸發memstore刷新。
- Region?Server級別限制:當一個Region?Server中所有Memstore的大小總和達到了上限(hbase.regionserver.global.memstore.upperLimit?*?hbase_heapsize,默認?40%的JVM內存使用量),會觸發部分Memstore刷新。Flush順序是按照Memstore由大到小執行,先Flush Memstore最大的Region,再執行次大的,直至總體Memstore內存使用量低于閾值(hbase.regionserver.global.memstore.lowerLimit?*?hbase_heapsize,默認?38%的JVM內存使用量)。
- 當一個Region?Server中HLog數量達到上限(可通過參數hbase.regionserver.maxlogs配置)時,系統會選取最早的一個 HLog對應的一個或多個Region進行flush
- HBase定期刷新Memstore:默認周期為1小時,確保Memstore不會長時間沒有持久化。為避免所有的MemStore在同一時間都進行flush導致的問題,定期的flush操作有20000左右的隨機延時。
- 手動執行flush:用戶可以通過shell命令?flush ‘tablename’或者flush ‘region?name’分別對一個表或者一個Region進行flush。
?
HLog (WAL) Size & Memstore Flush
當數據被寫入時會默認先寫入Write-ahead Log(WAL)。WAL中包含了所有已經寫入Memstore但還未Flush到HFile的更改(edits)。在Memstore中數據還沒有持久化,當RegionSever宕掉的時候,可以使用WAL恢復數據。
當WAL(在HBase中成為HLog)變得很大的時候,在恢復的時候就需要很長的時間。因此,對WAL的大小也有一些限制,當達到這些限制的時候,就會觸發Memstore的flush。Memstore flush會使WAL 減少,因為數據持久化之后(寫入到HFile),就沒有必要在WAL中再保存這些修改。有兩個屬性可以配置:
- hbase.regionserver.hlog.blocksize
- hbase.regionserver.maxlogs
你可能已經發現,WAL的最大值由hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize (2GB by default)決定。一旦達到這個值,Memstore flush就會被觸發。所以,當你增加Memstore的大小以及調整其他的Memstore的設置項時,你也需要去調整HLog的配置項。否則,WAL的大小限制可能會首先被觸發,因而,你將利用不到其他專門為Memstore而設計的優化。拋開這些不說,通過WAL限制來觸發Memstore的flush并非最佳方式,這樣做可能會會一次flush很多Region,盡管“寫數據”是很好的分布于整個集群,進而很有可能會引發flush“大風暴”。
提示:最好將hbase.regionserver.hlog.blocksize * hbase.regionserver.maxlogs 設置為稍微大于hbase.regionserver.global.memstore.lowerLimit * HBASE_HEAPSIZE.
?
頻繁的Memstore Flushes
要避免“寫阻塞”,貌似讓Flush操作盡量的早于達到觸發“寫操作”的閾值為宜。但是,這將導致頻繁的Flush操作,而由此帶來的后果便是讀性能下降以及額外的負載。
每次的Memstore Flush都會為每個CF創建一個HFile。頻繁的Flush就會創建大量的HFile。這樣HBase在檢索的時候,就不得不讀取大量的HFile,讀性能會受很大影響。
為預防打開過多HFile及避免讀性能惡化,HBase有專門的HFile合并處理(HFile Compaction Process)。HBase會周期性的合并數個小HFile為一個大的HFile。明顯的,有Memstore Flush產生的HFile越多,集群系統就要做更多的合并操作(額外負載)。更糟糕的是:Compaction處理是跟集群上的其他請求并行進行的。當HBase不能夠跟上Compaction的時候(同樣有閾值設置項),會在RS上出現“寫阻塞”。像上面說到的,這是最最不希望的。
Compaction操作盡量取消自動Compaction,使用空閑時間手動執行,已減少對服務的影響
?
參考資料:
http://blog.csdn.net/oozie123
http://hbasefly.com/2016/03/23/hbase-memstore-flush/
《Hbase權威指南》
https://blog.csdn.net/joeyon1985/article/details/71511891
其他的是之前做的筆記,沒有記錄當時參考文章~~~~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Hbase Memstore刷新方式与Region的数目上限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu 安装cudnn
- 下一篇: Kafka开发指南之 如何Kafka 事