
一個系統上線之後,開發和調優将一直貫穿系統的生命周期中,HBase也不列外。這裡學習下HBase的調優。
Hbase查詢優化
作為NoSQL資料庫,增删改查是其最基本的功能,其中查詢是最常用的一項。
設定Scan緩存
HBase中Scan查詢可以設定緩存,方法是setCaching(),這樣可以有效的減少服務端與用戶端的互動,更有效的提升掃描查詢的性能。
public void setCaching(int caching) {
this.caching = caching;
}
顯示的指定列
當使用Scan或者GET擷取大量的行時,最好指定所需要的列,因為服務端通過網絡傳輸到用戶端,資料量太大可能是瓶頸。如果能有效過濾部分資料,能很大程度的減少網絡I/O的花費。
public Scan addFamily(byte [] family) {
familyMap.remove(family);
familyMap.put(family, null);
return this;
}
public Scan addColumn(byte [] family, byte [] qualifier) {
NavigableSet<byte []> set = familyMap.get(family);
if(set == null) {
set = new TreeSet<byte []>(Bytes.BYTES_COMPARATOR);
}
if (qualifier == null) {
qualifier = HConstants.EMPTY_BYTE_ARRAY;
}
set.add(qualifier);
familyMap.put(family, set);
return this;
}
一般用:
scan.addColumn(...)
關閉ResultScanner
如果在使用table.getScanner之後,忘記關閉該類,它會一直和服務端保持連接配接,資源無法釋放,進而導緻服務端的某些資源不可用。是以在用完之後,需要執行關閉操作,這點與JDBS操作MySQL類似
scanner.close()
禁用塊緩存
如果批量進行全表掃描,預設是有緩存的,如果此時有緩存,會降低掃描的效率。
scan.setCacheBlocks(true|false);
對于經常讀到的資料,建議使用預設值,開啟塊緩存。
緩存查詢結果
對于頻繁查詢HBase的應用場景,可以考慮在應用程式和Hbase之間做一層緩存系統,新的查詢先去緩存查,緩存沒有再去查Hbase。
寫入優化
寫也是Hbase常有的操作之一,并且Hbase在寫入操作上有着其他NoSQL無法比拟的優勢,下面講如何優化寫入操作
關閉寫WAL日志
一般為了保證系統的高可用性,WAL日志預設是開啟狀态,WAL主要用于災難恢複的,如果應用可以容忍一定的資料丢失風險,可以在寫資料的時候,關閉寫WAL。
風險: 當RegionServer當機時,寫入的資料出現丢失,且無法恢複。
設定AutoFlush
Htable有一個屬性是AutoFlush,該屬性用于支援用戶端的批量更新,預設是true,當用戶端每收到一條資料,立刻發送到服務端,如果設定為false,當用戶端送出put請求時候,先将該請求在用戶端緩存,到達門檻值的時候或者執行hbase.flushcommits(),才向RegionServer送出請求。
風險 在請求未發送到RegionServer之前用戶端崩潰,資料也會丢失
table.setAutoFlush(false);
table.setWriteBufferSize( 12 * 1024 * 1024 );
預建立Region
一般表剛開始隻有一個Region,插入該表的資料都會儲存在此Region中,插入該表的所有塑化劑都會儲存在該Region中,當到達一定的門檻值時,才發生分裂。 這樣開始時刻針對該表的寫操作都集中在某台伺服器上,造成這台伺服器的壓力很緊張,同時對整個叢集資源的浪費。
建議剛開始的時候預建立Region,可以使用Hbase自帶的RegionSplitter
延遲日志flush
預設寫入操作,首先寫入WAL,并且在1S内寫入HDFS,這個時間預設是1S,可以通過參數配置
hbase.regionserver.optionallogflushinterval
可以配置大一點的值,比如5s,這段時間資料會保留在記憶體中,直到RegionServer周期性的執行flush操作。
希望能幫助大家。