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>