HBase 核心元件協調及RegionServer JVM引數調優-OLAP商業環境實戰

開心雲技術社群發表於2018-11-27

本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。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上。

HBase 核心元件協調及RegionServer JVM引數調優-OLAP商業環境實戰

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

相關文章