減少zk超時時間(建議1分鍾)
Rs與zk的timeout默認為3分鍾,由zookeeper.session.timeout property決定。也就是說,如果一個rs掛了,那么master需要3分鍾之后才能對其進行重啟和恢復。建議調成1分鍾會更低。
然而,你調低之前應該先確保JVM的配置合理,保證不會引發較長的gc,JVM配置之后會給出,也可以只這樣,只要你超時時間可以忍受gc停頓即可。
增加handlers(建議100)
配置項 hbase.regionserver.handler.count 決定了用戶表接受外來請求的線程數。默認為10。這個數目主要看你的場景。如果是put百萬字節或者大量的scan你可以把它調低來減少對region的壓力。如果是小的puts gets 則增加該值來挺高並發量。從而增加整體的吞吐。
Handler數量最好小於clinet並發量。一個典型場景就是多gets(可能是個網站,然后從hbase獲取數據)。
調高之后的風險就是,一旦很多的並發寫壓到了一個rs上面,那么內存會陡增,可能引發OOM。另外,rs的內存不足會引發較長的gc停頓。
增加heap(稍好的8G,差點的自己定吧)
對於hbase當然是越大約好,因為他就是吃內存的東西。稍微好點的機器可以給8G,master相比rs不需要更多的內存,但是rs一定需要。
開啟Lzo壓縮
增加region的大小(100G,幾乎永不分裂)
選項hbase.hregion.max.filesize默認為256M,如果region大小超過他則會分裂為二,如果你的數據量增長的比較快,那么還是建議把這個大小調高,可以調成100G,因為越少的region你的集群越流暢,100G的閾值基本可以避免你的region增長過快,甚至你的region數目會長期不變。當然大region在compaction時也會更加緩慢。幾十G的region啟動和compaction都非常的慢,如果storefile較多,一個compaction可能會持續幾天。
block cache size(讀寫平衡0.3)
選項perf.hfile.block.cache.size 默認是0.2。調優這個參數需要你自己的觀察,可以參照HBase權威指南的394頁。
其實常見場景還是讀業務比較多的時候可以把它調高。這樣可以緩存更多的數據。讀寫平衡可以設置為0.3。
需要注意的是,block.cache.size memstore limits 這些內存加起來不要超過60%。因為剩余的內存還要用來做其他事情。否則容易OOM。
memstore limits(寫多則調高,讀多則調低)
這里主要由兩個配置項決定:hbase.regionserver.global.memstore.upper 默認0.4和hbase.region.server.global.memstore.lowerLimit默認0.35。后者主要是當服務器需要釋放內存時強制rs進行flush(不一定達到flush size)。盡量保證上面兩個值接近,這樣可以避免頻繁的flush。
如果你的讀業務比較多,那么調低他們。如果寫多,則調高他們。(注意讀寫的參數相加最好不要超過0.6)。如果你發現flush很頻繁,那么調高上面兩個配置,這樣減少頻繁的I/O。
調高blocking store files(10)
選項hbase.hstore.blockingStoreFiles默認為7,如果超過其設定閾值,則會阻塞client的寫。它主要是為了給compaction更多的時間來減少store files的數量。如果你是持續寫入,那么稍微調高一點,比如10。你可以觀察rs的storefile的數量,如果數量一直比較高,那么就不要把這個閾值調高了。因為持續很多的sf會讓機器一直compaction,造成的一種情況就是compaction和flush的速度不匹配,然后持續的堆積compaction的任務,rs和dn的連接數會越來越大,直到too many open files。
調高block multiplier(穩定數據寫入不必調正,數據量比較大或者偶爾出現峰值則調高)
選項hbase.hregion.memstore.block.multiplier默認為2。它是一種安全機制,如果memstores超過了flushsize的multiplier倍則會阻塞客戶端的寫。
如果你有足夠多的內存,那么你可以把它調高,這樣的好處就是可以很好的處理峰值的情況。比如一天可能只有一個時間段內寫量很大,那么調高之后就可以避免阻塞寫操作了。
減少maximum logfiles(導入數據直接關閉WAL即可,寫多則調高,一般情況下小一點比較好)
選項hbase.regionserver.maxlogs默認為32。它只要是控制WAL文件flush的頻率。如果寫操作比較多,那么可以設置高一點。調低可以讓rs更快的把數據持久化,那么就可以直接棄掉WAL了。其實寫操作比較多可以直接把WAL關閉,這樣更省事了。