1. 程式人生 > >HBase線上系統性能優化

HBase線上系統性能優化

一、手工進行Major Compaction

實時系統最好關閉HBase的自動Major Compaction,HBase在進行Major Compaction時會合並所有的儲存檔案,整個Region都不可用。HBase預設大約每天執行一次Compaction,最好把自動Compaction禁用,採用crontab在閒時觸發執行。

修改HBase配置:

<property>
  <name>hbase.hregion.majorcompaction</name>
  <value>0</value>
</property>

將時間設定為0,禁用自動Major Compaction。

在HBase Shell中執行指令碼:

major_compact ‘table_name’

這樣就能手工執行一次Major Compaction。將所有的表名稱寫成一個檔案,然後在shell指令碼中遍歷這個檔案,執行HBase Shell命令,就可以定時自動執行了。

for table in $(cat $TABLES_FILE); do
  echo “major_compact ‘$table'” | $HBASE_HOME/bin/hbase shell
  sleep 10
done

寫成shell,設定一下crontab,每天夜深人靜的時候跑一下就可以了。

二、手工進行Split 

建議關閉HBase的自動Split,夜深人靜業務量小的時候手工Split。

要關閉自動split,需要調整 “hbase.hregion.max.filesize” 引數。不建議把這個引數設定成Long.MAX_VALUE,萬一忘記了做手工split會出麻煩的。可以把這個值設定成100G,100G的檔案split大約需要1小時的時間。

<property> 
  <name>hbase.hregion.max.filesize</name> 
  <value>107374182400</value> 
</property>

具體調成什麼值要看系統的資料量,要調一個每天的資料量不可能達到、定時器萬一失靈也不會造成麻煩的值。

三、設定blockingStoreFiles

轉自:http://www.cfanz.cn/index.php?c=article&a=read&id=62909

這個引數的重要性是在我們的效能測試中發現的。我們禁掉major_compaction和split後理論上寫入應該無障礙了,但在測試中發現寫入單個region速度大於10M/s時還是會出現長時間無法寫入的情況。通過檢視log,我們發現了這行log“Waited 90314ms on a compaction to clean up ‘too many store  files‘”,通過檢視程式碼發現原來是blockingStoreFiles這個引數在作怪。

在flushRegion時會檢測當前store中hfile的數量是否大於此值,如果大於則會block資料的寫入,等待其他執行緒將hfile compact掉。這樣,如果寫入速度超過compact的速度,hbase就會阻止該region的資料寫入。

private boolean flushRegion(final FlushRegionEntry fqe) {
  HRegion region = fqe.region;
  if (!fqe.region.getRegionInfo().isMetaRegion() && isTooManyStoreFiles(region)) { 
    if (fqe.isMaximumWait(this.blockingWaitTime)) { 
      LOG.info(“Waited ” + (System.currentTimeMillis() – fqe.createTime) + “ms on a compaction to clean up ‘too many store files'; waited ” + “long enough… proceeding with flush of ” + region.getRegionNameAsString()); 
    }

預設值為7

  this.blockingStoreFilesNumber = conf.getInt(“hbase.hstore.blockingStoreFiles”, 7); 
  if (this.blockingStoreFilesNumber == -1) { 
    this.blockingStoreFilesNumber = 1 + conf.getInt(“hbase.hstore.compactionThreshold”, 3);
  }

我們將此值設為很大的值,使得此問題不會block我們的寫入。

<property> 
  <name>hbase.hstore.blockingStoreFiles</name> 
  <value>2100000000</value>
</property>