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)
寫也是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操做。