作者: 大圓那些事 | 文章可以轉載,請以超連結形式標明文章原始出處和作者資訊
網址: http://www.cnblogs.com/panfeng412/archive/2012/10/17/how-to-resolve-hbase-region-server-compaction-taking-up-too-much-network-bandwidth.html
推薦:《HBase權威指南》
HBase 0.92版本之後,Region Server的Compact過程根據待合并的檔案大小分為small compaction和large compaction兩種,由此可能導致在叢集寫入量大的時候Compact佔用過多的網路出口頻寬。本文將詳細描述叢集使用過程中遇到這一問題的排查過程及其解決方案。
1. 發現問題
HBase叢集(版本為0.94.0)運行過程中,發現5台Region Server的網路出口頻寬經常維持在100MB/s以上,接近到網卡的極限;同時Region Server的機器load負載也很高,高峰時候能夠達到30~50。
2. 排查問題
1、叢集實際運行過程中,觀察到Region Server服務端的網卡,平均每台寫入流量大概60MB/s(此時寫入量已經很大了);讀出流量90MB/s,有時甚至突破100MB/s(註:每台機器都是千兆網卡);
2、觀察實際的寫入資料量在每秒5w tps左右,單條記錄平均大小為1KB,大概會佔用50MB/s左右的網卡入口頻寬請求量,和觀察到的現象一致;
3、觀察查詢量在每秒6w qps左右,單條記錄平均大小為1KB,大概會佔用60MB/s左右的網卡出口頻寬請求量,奇怪的是實際觀察到有接近甚至超過100MB/s的網路出口頻寬請求量,多出了40MB/s左右的網路出口頻寬;
4、經分析排查確定導致上述過程的原因,可能是HBase服務端由於寫入量過大頻繁觸發compaction過程,而compaction是需要讀HBase資料的,因此佔據了相當部分的網路出口頻寬;
5、結合對相關源碼org/apache/hadoop/hbase/regionserver/CompactSplitThread.java的分析,決定對HBase叢集配置做出變更(具體見下一小節),主要目的是減少compaction的發生;
6、接下來,觀察到Region Server的網路利用率明顯降低,一般進出口頻寬能維持在70MB/s以下。
3. 解決問題
HBase 0.92版本之後增加了關於compact的配置選項,compact分為small compaction和large compaction兩個線程池執行(預設都是各有1個線程,具體原始碼見:org/apache/hadoop/hbase/regionserver/CompactSplitThread.java),由於compact過程需要從HBase叢集讀取資料,因此實際運行中導致了compact佔用大量網路出口流量,解決方案為選擇性地關閉small compaction或large compaction。有以下兩種變更方式均可解決:
1)方案一
(1) 修改hbase.regionserver.thread.compaction.throttle為一個很大的值(如50GB),強制讓所有compact都變為small compaction,減少compact的壓力;
(2) 將small compaction和large compaction線程數均設定為1,減少compact的壓力(可不配置,系統預設也會將其初始化為1)。
操作步驟:
準備hbase-site.xml檔案,添加或修改如下選項:
<property> <name>hbase.regionserver.thread.compaction.throttle</name> <value>53687091200</value></property><property> <name>hbase.regionserver.thread.compaction.small</name> <value>1</value></property><property> <name>hbase.regionserver.thread.compaction.large</name> <value>1</value></property>
重啟叢集使配置生效。
2)方案二
將small compaction線程數均設定為0,從而關閉small compaction,只剩下large compaction,也可減少compact的壓力。
操作步驟:
準備hbase-site.xml檔案,添加或修改如下選項:
<property> <name>hbase.regionserver.thread.compaction.small</name> <value>0</value></property>
重啟叢集使配置生效。