HBase優化——讀寫優化

Hbase2.0查詢優化

1)設置scan緩存redis

HBase中Scan查詢能夠設置緩存,方法是setCaching(),這樣能夠有效的減小服務端與客戶端的交互,更有效的提高掃描查詢的性能。緩存

Scan scan = new Scan();
scan.setCaching(1000);

2)顯示的指定列服務器

當使用Scan或者GET獲取大量的行時,最好指定所須要的列,由於服務端經過網絡傳輸到客戶端,數據量太大多是瓶頸。若是能有效過濾部分數據,能很大程度的減小網絡I/O的花費。網絡

Scan scan = new Scan();
scan.addColumn(Bytes.toBytes("f"), Bytes.toBytes("t"));
scan.addFamily(Bytes.toBytes("f"));

Get get = new Get(Bytes.toBytes("demo"));
get.addColumn(Bytes.toBytes("f"), Bytes.toBytes("t"));
get.addFamily(Bytes.toBytes("f"));

通常狀況下用:
scan.addColumn(…)性能

3)關閉ResultScanner優化

若是在使用 table.getScanner以後,忘記關閉該類,它會一直和服務端保持鏈接,資源沒法釋放,從而致使服務端的某些資源不可用。spa

因此在用完以後,須要執行關閉操做,這點與JDBS操做MySQL相似。日誌

Scan scan = new Scan()
ResultScanner scanner = table.getScanner(scan)
for (Result  rs <- scanner) {
   do something.....
}
scanner.close()

4) 禁用塊緩存code

若是批量進行全表掃描,默認是有緩存的,若是此時有緩存,會下降掃描的效率。server

Scan scan = new Scan()
scan.setCacheBlocks(true|false);

對於常常讀到的數據,建議使用默認值,開啓塊緩存

5) 緩存查詢結果

對於頻繁查詢HBase的應用場景,能夠考慮在應用程序和Hbase之間作一層緩存系統(redis等),新的查詢先去緩存查,緩存沒有再去查Hbase。

6)設定scan的查詢範圍

若是能夠明確的掃描範圍,建議設置scan的StartRow和StopRow

Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes("0000"));
scan.withStopRow(Bytes.toBytes("9999"));

7) 批量get執行

若是能夠肯定rowkey的值,在批量查詢的時候建議用批量Get方式

List<Get> gets = new ArrayList<Get>();
gets.add(new Get(Bytes.toBytes("000")));
gets.add(new Get(Bytes.toBytes("111")));
gets.add(new Get(Bytes.toBytes("222")));
gets.add(new Get(Bytes.toBytes("333")));
table.get(gets)

 

Hbase2.0寫入優化

寫也是Hbase常有的操做之一,而且Hbase在寫入操做上有着其餘NoSQL沒法比擬的優點,下面講如何優化寫入操做

1)關閉寫WAL日誌
通常爲了保證系統的高可用性,WAL日誌默認是開啓狀態,WAL主要用於災難恢復的,若是應用能夠容忍必定的數據丟失風險,能夠在寫數據的時候,關閉寫WAL。

風險: 當RegionServer宕機時,寫入的數據出現丟失,且沒法恢復

 

2)設置AutoFlush
Htable有一個屬性是AutoFlush,該屬性用於支持客戶端的批量更新,默認是true,當客戶端每收到一條數據,馬上發送到服務端,若是設置爲false,當客戶端提交put請求時候,先將該請求在客戶端緩存,到達閾值的時候或者執行hbase.flushcommits(),才向RegionServer提交請求。

table.setAutoFlush(false);
table.setWriteBufferSize( 12 * 1024 * 1024 );

3)預建立Region
通常表剛開始只有一個Region,插入該表的數據都會保存在此Region中,插入該表的全部塑化劑都會保存在該Region中,當到達必定的閾值時,才發生分裂。 這樣開始時刻針對該表的寫操做都集中在某臺服務器上,形成這臺服務器的壓力很緊張,同時對整個集羣資源的浪費

建議剛開始的時候預建立Region,可使用Hbase自帶的RegionSplitter

4)延遲日誌flush
默認寫入操做,首先寫入WAL,而且在1S內寫入HDFS,這個時間默認是1S,能夠經過參數配置

hbase.regionserver.optionallogflushinterval

能夠配置大一點的值,好比5s,這段時間數據會保留在內存中,直到RegionServer週期性的執行flush操做。

相關文章
相關標籤/搜索