HBase效能優化方法總結(三) 讀表操作

2022-02-04 07:32:55 字數 3467 閱讀 4197

本文主要是從hbase應用程式設計與開發的角度,總結幾種常用的效能優化方法。有關hbase系統配置級別的優化,可參考:**ken wu同學的部落格。

建立多個htable客戶端用於讀操作,提高讀資料的吞吐量,乙個例子:

static final 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值的例子:

public class 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.4memstore=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...