本文主要是從hbase應用程式設計與開發的角度,總結幾種常用的效能優化方法。有關hbase系統配置級別的優化,可參考:**ken wu同學的部落格。
建立多個htable客戶端用於讀操作,提高讀資料的吞吐量,乙個例子:
staticfinal configuration conf = hbaseconfiguration.create();
static
final string table_log_name = 「user_log」;
rtablelog = new htable[tablen];
for (int i = 0; i < tablen; i++)
hbase.client.scanner.caching配置項可以設定hbase scanner一次從服務端抓取的資料條數,預設情況下一次一條。通過將其設定成乙個合理的值,可以減少scan過程中next()的時間開銷,代價是scanner需要通過客戶端的記憶體來維持這些被cache的行記錄。
有三個地方可以進行配置:1)在hbase的conf配置檔案中進行配置;2)通過呼叫htable.setscannercaching(int scannercaching)進行配置;3)通過呼叫scan.setcaching(int caching)進行配置。三者的優先順序越來越高。
scan時指定需要的column family,可以減少網路傳輸資料量,否則預設scan操作會返回整行所有column family的資料。
通過scan取完資料後,記得要關閉resultscanner,否則regionserver可能會出現問題(對應的server資源無法釋放)。通過呼叫htable.get(get)方法可以根據乙個指定的row key獲取一行記錄,同樣hbase提供了另乙個方法:通過呼叫htable.get(list)方法可以根據乙個指定的row key列表,批量獲取多行記錄,這樣做的好處是批量執行,只需要一次網路i/o開銷,這對於對資料實時性要求高而且網路傳輸rtt高的情景下可能帶來明顯的效能提公升。
在客戶端開啟多個htable讀執行緒,每個讀執行緒負責通過htable物件進行get操作。下面是乙個多執行緒併發讀取hbase,獲取店鋪一天內各分鐘pv值的例子:
publicclass datareaderserver
return parallelbatchminutepv(lst);}//
多執行緒併發查詢,獲取分鐘pv值
private
static concurrenthashmapparallelbatchminutepv(listlstkeys)
else
for(int i = 0 ; i < lstkeys.size() ; i ++ )
}list>> futures = new arraylist>>(5);
threadfactorybuilder builder = new threadfactorybuilder();
builder.setnameformat("parallelbatchquery");
threadfactory factory = builder.build();
threadpoolexecutor executor = (threadpoolexecutor) executors.newfixedthreadpool(lstbatchkeys.size(), factory);
for(listkeys : lstbatchkeys)
executor.shutdown();
//wait for all the tasks to finish
try catch (exception e)
}} catch (interruptedexception e) catch (exception e1) }//
look for any exception
for (future f : futures)
} catch (interruptedexception e) catch (exception e1)
} catch (executionexception e)
}return hashret;}//
乙個執行緒批量查詢,獲取分鐘pv值
protected
static concurrenthashmapgetbatchminutepv(listlstkeys)
result res = null;
try catch (ioexception e1)
if (res != null && res.length > 0)
} catch (exception e2) }}
}return hashret;}}
//呼叫介面類,實現callable介面
class batchminutepvcallable implements callable>
public concurrenthashmapcall() throws exception
}
對於頻繁查詢hbase的應用場景,可以考慮在應用程式中做快取,當有新的查詢請求時,首先在快取中查詢,如果存在則直接返回,不再查詢hbase;否則對hbase發起讀請求查詢,然後在應用程式中將查詢結果快取起來。至於快取的替換策略,可以考慮lru等常用的策略。
hbase上regionserver的記憶體分為兩個部分,一部分作為memstore,主要用來寫;另外一部分作為blockcache,主要用於讀。
寫請求會先寫入memstore,regionserver會給每個region提供乙個memstore,當memstore滿64mb以後,會啟動 flush重新整理到磁碟。當memstore的總大小超過限制時(heapsize * hbase.regionserver.global.memstore.upperlimit * 0.9),會強行啟動flush程序,從最大的memstore開始flush直到低於限制。
讀請求先到memstore中查資料,查不到就到blockcache中查,再查不到就會到磁碟上讀,並把讀的結果放入blockcache。由於blockcache採用的是lru策略,因此blockcache達到上限(heapsize * hfile.block.cache.size * 0.85)後,會啟動淘汰機制,淘汰掉最老的一批資料。
乙個regionserver上有乙個blockcache和n個memstore,它們的大小之和不能大於等於heapsize * 0.8,否則hbase不能啟動。預設blockcache為0.2,而memstore為0.4。對於注重讀響應時間的系統,可以將blockcache設大些,比如設定blockcache=0.4,memstore=0.39,以加大快取的命中率。
有關blockcache機制,請參考這裡:hbase的block cache,hbase的blockcache機制,hbase中的快取的計算與使用。
HBase效能優化方法總結(三) 讀表操作
本文主要是從hbase應用程式設計與開發的角度,總結幾種常用的效能優化方法。有關hbase系統配置級別的優化,可參考 ken wu同學的部落格。3.讀表操作 3.1 多htable併發讀 建立多個htable客戶端用於讀操作,提高讀資料的吞吐量,乙個例子 static final configura...
HBase效能優化方法總結(三) 讀表操作
本文主要是從hbase應用程式設計與開發的角度,總結幾種常用的效能優化方法。有關hbase系統配置級別的優化,可參考 ken wu同學的部落格。建立多個htable客戶端用於讀操作,提高讀資料的吞吐量,乙個例子 static final configuration conf hbaseconfigu...
HBase效能優化方法總結(三) 讀表操作
本文主要是從hbase應用程式設計與開發的角度,總結幾種常用的效能優化方法。有關hbase系統配置級別的優化,可參考 ken wu同學的部落格。建立多個htable客戶端用於讀操作,提高讀資料的吞吐量,乙個例子 static final configuration conf hbaseconfigu...