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