1. 程式人生 > >hbase的調優

hbase的調優

Hbase的優化

服務端優化:

  1. hbase.regionserver.handler.count:rpc請求的執行緒數量,預設值是10,生產環境建議使用100,特別大的時候scan/put幾M的資料,會佔用過多的記憶體,有可能導致頻繁的GC,甚至oom。
  2. hbase.regionserver.hlog.splitlog.writer.threads:預設值是3,建議設為10,日誌切割所用的執行緒數
  3. hbase.regionserver.global.memstore.upperLimit:預設值0.4,regionserver所有memstore佔用記憶體在總記憶體中的upper比例,當達到該值,則會從整個regionserver中找出最需要flush的region進行flush
  4. hbase.regionserver.global.memstore.lowerLimit:預設值0.35
  5. hbase.regionserver.thread.compaction.small:預設值為1,regionserver做Minor Compaction時執行緒池裡執行緒數目,可以設定為5。
  6. hbase.regionserver.thread.compaction.large:預設值為1,regionserver做Major Compaction時執行緒池裡執行緒數目,可以設定為8。
  7. hbase.regionserver.lease.period:預設值60000(60s),客戶端連線regionserver的超時時間,這個最好根據實際業務情況進行調整
  8. hbase.hregion.max.filesize:預設10G,StoreFile,建議手動定時分裂,可以設定為60G
  9. hbase.hregion.majorcompaction:hbase的region主合併的間隔時間,預設為1天,建議設定為0,禁止自動的major主合併,major合併會把一個store下storefile合併為storefile檔案,在合併過程中刪除標識的資料,主合併可能持續數小時,減少業務影響,業務低峰期手動、指令碼、api定期進行major合併。
  10. hbase.hregion.memstore.flush.size:預設值128M,一旦有memstore超過該值flush,如果regionserver的jvm記憶體比較充足(16G),可以調整為256M。
  11. hbase.hregion.memstore.block.multiplier:預設值2,如果一個memstore的記憶體大小已經超過  .flush.size *  .block.multiplier,則會阻塞該memstore的寫操作,為避免阻塞,建議為5,太大會有OOM的風險。在regionserver日誌中出現"Blocking updates for '<threadName>' on region <regionName> : memstore size <多少M> is >= than blocking <多少M> size"的資訊時,說明這個值該調整了。
  12. hbase.hstore.compaction.min:預設值為3,任何一個store裡的storefile總數超過該值,會觸發預設的合併操作,可以設定5~8,在手動的定期major compact中進行storefile檔案的合併,減少合併的次數,延長合併的時間。
  13. hbase.hstore.compaction.max:預設值為10,一次最多合併storefile個數,避免OOM。
  14. hbase.hstore.blockingStoreFiles:預設為7,任何一個store的storefile的檔案數大於該值,則在flush memstore前先進行split/compact,同時把該region新增到flushQueue,延時重新整理,這期間會阻塞寫操作直到compact完成/超過hbase.hstore.blockingWaitTime(90s)配置的時間,可以設定為30,避免memstore不及時flush。當regionserver執行日誌中出現大量的“Region <regionName> has too many store files; delaying flush up to 90000ms"時,說明這個值需要調整了
  15. hbase.master.distributed.log.splitting:預設值為true,建議設為false。關閉hbase的分散式日誌切割,在log需要replay時,由master來負責重放
  16. hbase.snapshot.enabled:快照功能,預設是false(不開啟),建議設為true,特別是對某些關鍵的表,定時用快照做備份是一個不錯的選擇。
  17. hfile.block.cache.size:預設值0.25,regionserver的block cache的記憶體大小限制,在偏向讀的業務中,可以適當調大該值,需要注意的是hbase.regionserver.global.memstore.upperLimit的值和hfile.block.cache.size的值之和必須小於0.8。
  18. dfs.socket.timeout:預設值60000(60s),建議根據實際regionserver的日誌監控發現了異常進行合理的設定,比如我們設為900000,這個引數的修改需要同時更改hdfs-site.xml
  19. dfs.datanode.socket.write.timeout:預設480000(480s),有時regionserver做合併時,可能會出現datanode寫超時的情況,480000 millis timeout while waiting for channel to be ready for write,這個引數的修改需要同時更改hdfs-site.xml

 

Client端優化:

1.hbase.client.write.buffer:預設為2M,寫快取大小,推薦設定為5M,單位是位元組,當然越大佔用的記憶體越多,此外測試過設為10M下的入庫效能,反而沒有5M好

2.hbase.client.pause:預設是1000(1s),如果你希望低延時的讀或者寫,建議設為200,這個值通常用於失敗重試,region尋找等

3.hbase.client.retries.number:預設值是10,客戶端最多重試次數,可以設為11,結合上面的引數,共重試時間71s

4.hbase.ipc.client.tcpnodelay:預設是false,建議設為true,關閉訊息緩衝

5.hbase.client.scanner.caching:scan快取,預設為1,避免佔用過多的client和rs的記憶體,一般1000以內合理,如果一條資料太大,則應該設定一個較小的值,通常是設定業務需求的一次查詢的資料條數 

如果是掃描資料對下次查詢沒有幫助,則可以設定scan的setCacheBlocks為false,避免使用快取;

6.table用完需關閉,關閉scanner

7.限定掃描範圍:指定列簇或者指定要查詢的列,指定startRow和endRow

8.使用Filter可大量減少網路消耗

9.通過Java多執行緒入庫和查詢,並控制超時時間。後面會共享下我的hbase單機多執行緒入庫的程式碼

10.建表注意事項:

開啟壓縮

合理的設計rowkey

進行預分割槽

開啟bloomfilter

 

jvm和垃圾收集引數

export HBASE_REGIONSERVER_OPTS="-Xms36g -Xmx36g -Xmn1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=15 -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/data/logs/gc-$(hostname)-hbase.log"

由於我們伺服器記憶體較大(96G),我們給一部分regionserver的jvm記憶體開到64G,到現在為止,還沒有發生過一次full gc,hbase在記憶體使用控制方面確實下了不少功夫,比如各種blockcache的實現,細心的同學可以看原始碼。

 

ZooKeeper調優

  1. zookeeper.session.timeout:預設值3分鐘,不可配置太短,避免session超時,hbase停止服務,線上生產環境由於配置為1分鐘,如果太長,當regionserver掛掉,zk還得等待這個超時時間(已有patch修復),從而導致master不能及時對region進行遷移。
  2. 檢視zk節點狀態。重新啟動zk節點前後,一定要檢視狀態

echo ruok | nc host port

echo stat | nc host port

3.