HBase生產環境叢集容量規劃最優配置-OLAP商業環境實戰
本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何學術交流,可隨時聯絡。
網上的Hbase調優資料參差不齊,實在是不忍卒讀,有些都是拼湊且版本過時的東西,我這裡決定綜合所有優質資源進行整合,寫一份最全,最有深度,不過時的技術部落格。辛苦成文,各自珍惜,謝謝!
1 HBase生產環境叢集調優關鍵點
- HBase中記憶體規劃直接涉及讀快取BlockCache、寫快取MemStore,影響系統記憶體利用率、IO利用率等資源以及讀寫效能等,重要性不言而喻。因此HBase生產環境叢集調優主要也是針對BlockCache和MemStore進行的。
- 對於讀快取BlockCache,線上一般會有兩種工作模式:LRUBlockCache和BucketCache
- 讀多寫少型+BucketCache
- 寫多讀少型+LRUBlockCache
- 業務到底使用BucketCache還是使用LRUBlockCache,只和分配給RegionServer的記憶體大小有關。一般而言,如果HBASE_HEAPSIZE > 20G,選擇BucketCache,否則選擇LRUBlockCache。
2 讀多寫少型+BucketCache
-
對於讀多寫少型+BucketCache架構:整個RegionServer記憶體(Java程序記憶體)分為兩部分:JVM記憶體和堆外記憶體。其中JVM記憶體中LRUBlockCache和堆外記憶體BucketCache一起構成了讀快取CombinedBlockCache,用於快取讀到的Block資料,其中LRUBlockCache用於快取元資料Block,BucketCache用於快取實際使用者資料Block;MemStore用於寫流程,快取使用者寫入KeyValue資料;還有部分用於RegionServer正常執行所必須的記憶體;
-
本例中物理機記憶體也是96G,不過業務型別為讀多寫少:70%讀+30%寫:
-
官方要求:RUBlockCache + MemStore < 80% *JVM_HEAP,否則RS無法啟動。這個規定的本質是為了在記憶體規劃的時候能夠給除過寫快取和讀快取之外的其他物件留夠至少20%的記憶體空間。那按照上述計算方式能不能滿足這個硬規定呢?
(LRU + MemStore) / JVM_HEAP = 3.2G + 19.2G / 35.2G = 22.4G / 35.2G = 63.6% 複製程式碼
-
上述結果遠小於80%。因此需要對計算值進行簡單的修正,適量減少JVM_HEAP值(減少至30G),增大Memstore到20G。因為JVM_HEAP減少了,堆外記憶體就需要適量增大,因此將BucketCache增大到30G。修正之後,
(LRU + MemStore) / JVM_HEAP = (3.2G + 20G )/ 30G = 23.2G / 30G = 77% 複製程式碼
-
引數配置:
(1)設定JVM引數如下: -XX:SurvivorRatio=2 -XX:+PrintGCDateStamps -Xloggc:$HBASE_LOG_DIR/gc-regionserver.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -server -Xmx40g -Xms40g -Xmn1g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-DisableExplicitGC (2)hbase-site.xml中MemStore相關引數設定如下: hbase.regionserver.global.memstore.upperLimit引數被廢棄了,改用 hbase.regionserver.global.memstore.size預設是0.4 根據upperLimit引數的定義,結合上述記憶體規劃資料可計算出 global.memstore.size = 20G / 30G = 66%。 因此hbase.regionserver.global.memstore.size引數設定為0.66,lowerLimit設定為0.60 <property> <name>hbase.regionserver.global.memstore.size</name> <value>0.66</value> </property> <property> <name>hbase.regionserver.global.memstore.lowerLimit</name> <value>0.60</value> </property> (3) hbase-site.xml中CombinedBlockCache相關引數設定如下: hbase.bucketcache.ioengine表示bucketcache設定為offheap模式;hbase.bucketcache.size表示所有讀快取佔用記憶體大小, 該值可以為記憶體真實值,單位為M,也可以為比例值,表示讀快取大小佔JVM記憶體大小比例。如果為記憶體真實值,則為34G,即34816。 hbase.bucketcache.percentage.in.combinedcache 引數被廢棄了 <property> <name>hbase.bucketcache.ioengine</name> <value>offheap</value> </property> <property> <name>hbase.bucketcache.size</name> <value>34816</value> </property> 複製程式碼
3 寫多讀少型 + LRUBlockCache
-
整個物理機記憶體:96G
-
業務負載分佈:30%讀,70%寫
-
系統記憶體基礎上如何規劃RS記憶體,一般情況下,在不影響其他服務的情況下,越大越好。我們目前設定為64G,為系統記憶體的2/3
(1)如何設定LRUBlockCache、MemStore,HBase在此處有個硬規定:LRUBlockCache + MemStore < 80% * JVM_HEAP,否則RS無法啟動,記憶體規劃: MemStore = 45% * JVM_HEAP = 64G * 45% = 28.8G ,LRUBlockCache = 30% * JVM_HEAP = 64G * 30% = 19.2G;預設情況下Memstore為40% * JVM_HEAP,而LRUBlockCache為25% * JVM_HEAP (2)設定JVM引數如下: -XX:SurvivorRatio=2 -XX:+PrintGCDateStamps -Xloggc:$HBASE_LOG_DIR/gc-regionserver.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -server -Xmx64g -Xms64g -Xmn2g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-DisableExplicitGC (3)hbase-site.xml中MemStore相關引數設定如下: base.regionserver.global.memstore.upperLimit引數被廢棄了,改用 hbase.regionserver.global.memstore.size預設是0.4 hbase.regionserver.global.memstore.size設定為0.45,hbase.regionserver.global.memstore.lowerLimit設定為0.40 hbase.regionserver.global.memstore.size表示RegionServer中所有MemStore佔有記憶體在JVM記憶體中的比例上限。如果所佔比例超過這個值,RS寫請求就會阻塞,RS會首先將所有Region按照MemStore大小排序,並按照由大到小的順序依次執行flush,直至所有MemStore記憶體總大小小於hbase.regionserver.global.memstore.lowerLimit,一般lowerLimit比upperLimit小5%。 <property> <name>hbase.regionserver.global.memstore.size</name> <value>0.45</value> </property> <property> <name>hbase.regionserver.global.memstore.lowerLimit</name> <value>0.4</value> </property> (4) hbase-site.xml中LRUBlockCache相關引數設定如下: hfile.block.cache.size表示LRUBlockCache佔用記憶體在JVM記憶體中的比例,因此設定為0.3 <property> <name>hfile.block.cache.size</name> <value>0.3</value> </property> 複製程式碼
總結
本文參考了一篇非常好的部落格《HBase最佳實踐-記憶體規劃》,只可惜版本太老,導致部分引數已經廢棄,本文進行了修正,辛苦成文,各自珍惜,謝謝!
秦凱新 於深圳 20181128200