本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:1120746959@qq.com,如有任何學術交流,可隨時聯絡。
1 弱化的Master
HBase中Master的角色被弱化了,就算短時間待機都不會受影響,但不能當機時間太久,資料的讀取和寫入都跟他沒有什麼關係。那麼Master主要負責什麼呢?建立表,修改列族配置,Region的分割和合並操作。
2 幹保險業的WAL
HBase所有資料的寫入操作第一步先二話不說寫進WAL中,然後進一步寫進MemStore中。等到MemStore的資料達到一定的數量時才刷寫到最終儲存的HFile中。如果在刷寫的時候當機或者斷電了,幹保險業的WAl就會起到資料恢復的作用。為什麼呢?因為WAL是放在HDFS上的,當機是不影響WAL檔案的。
3 MemStore 真的是加速機嗎?
注意資料寫入到MemStore之前,是要先要寫入到WAL的,所以增加MemStore並不能加快寫入速度,MemStore最大的意義,在於維持資料按照rowkey的順序排列,進而資料在MemStore中被整理成LSM樹,最後再刷寫到HFile上。
4 Store 和 Column Family的關係
在一個RegionServer中,會有多個Region,而在每一個Region中,會根據 Column Family生成多個Store。注意一個Store又會對應一個MemStore。而一個RegionServer對應一個全域性的BlockCache。
5 Minor compact 和 Major Compact
-
Minor compact :可以用於把多個HFile檔案進行合併,同時可以刪除TTL過期的資料,但是手動刪除資料操作是不能被刪除的。為什麼這裡可以刪除TTL過期的資料?因為MemStore在LSM整理時,對於TTL過期只要不寫入HFile檔案就算是刪除了,而對於手動刪除資料操作則可能位於不同的HFile檔案中,因此做不到刪除。
-
Major Compact:是把一個Store中的HFile檔案合併為一個HFile檔案,而不是把一個Region內的所有HFile檔案,因為一個Region可能有多個Column Family對應的Store。
6 RegioneServer的JVM引數調優
-
編輯hbase-env . sh,調整HBASE_HEAPSIZE大小,預設是1G,而MemStore則佔用40%,也就是400M。顯然是不夠的。因此需要根據需要設定,比如:
export HBASE_HEAPSIZE =8G 複製程式碼
-
HBase JVM 最大使用記憶體調整:
(1) HBASE_MASTER_OPTS
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xmx4g -Xms4g" 複製程式碼
(2) HBASE_REGIONSERVER_OPTS
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g" 複製程式碼
注意永遠至少留10%的記憶體給作業系統。
-
舉例如下:一臺16GB的機器,上面有MapReduce服務,RegionServer 和 DataNode
分配策略如下:
- 系統程式:2G
- MapReduce:8GB
- RegionServer服務:4GB
- TaskTracker:1GB
- DataNode:1GB
7 朱麗葉暫停FULL GC
-
原因主要是Zookeeper惹的禍,在RegionServer發生FULL GC的時候,STW期間太長,被ZK標記為當機,當RegionerServer GC完成後,甦醒了發現被標記為當機了,這時候RegionerServer GC就自殺,防止腦裂發生。醒來再自殺,朱麗葉暫停,哈哈!
-
JVM提供4種GC方案
-
如果你的RegionServer記憶體大於32GB,建議使用G1GC策略,因為G1Gc會把堆記憶體劃分為多個Region,然後對各個Region單獨進行GC,這樣整體的Full GC 可以被最大限度地避免。另外通過設定MaxGCPauseMillis最大暫停時間,避免時間太長RegionServer自殺。
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g -XX:+UseG1GC -XX:+MaxGCPauseMillis=100" 複製程式碼
-
如果你的RegionServer記憶體小於4GB,就不需要考慮G1GC策略了,直接使用
-XX:+UseParNewGC (年輕代使用) -XX:+UseConcMarkSweepGC(年老代使用) export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC " 複製程式碼
-
8 Justin Kestelyn 測試調優論文
- 32GB heap : -XX:G1NewSizePercent=3 設定要用作年輕代大小最小值的堆百分比。預設值是 Java 堆的 5%。這是一個實驗性的標誌
- 64GB heap: -XX:G1NewSizePercent=2
- 100GB 或者更大的heap時,-XX:G1NewSizePercent=1
9 總結
網上的Hbase調優資料參差不齊,實在是不忍卒讀,有些都是拼湊且版本過時的東西,我這裡決定綜合所有優質資源進行整合,寫一份最全,最有深度,不過時的技術部落格。辛苦成文,各自珍惜,謝謝!
本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:1120746959@qq.com,如有任何學術交流,可隨時聯絡。
秦凱新 於深圳 20182309