HBase之效能優化

2021-12-30 08:42:12 字數 3321 閱讀 9713

3. 讀表操作

3.1 多htable併發讀

建立多個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++) 3.2 htable引數設定

3.2.1 scanner caching

通過呼叫htable.setscannercaching(int scannercaching)可以設定hbase scanner一次從服務端抓取的資料條數,預設情況下一次一條。通過將此值設定成乙個合理的值,可以減少scan過程中next()的時間開銷,代價是scanner需要通過客戶端的記憶體來維持這些被cache的行記錄。

3.2.2 scan attribute selection

scan時指定需要的column family,可以減少網路傳輸資料量,否則預設scan操作會返回整行所有column family的資料。

3.2.3 close resultscanner

通過scan取完資料後,記得要關閉resultscanner,否則regionserver可能會出現問題(對應的server資源無法釋放)。

3.3 批量讀

通過呼叫htable.get(get)方法可以根據乙個指定的row key獲取一行記錄,同樣hbase提供了另乙個方法:通過呼叫htable.get(list<:get>)方法可以根據乙個指定的row key列表,批量獲取多行記錄,這樣做的好處是批量執行,只需要一次網路i/o開銷,這對於對資料實時性要求高而且網路傳輸rtt高的情景下可能帶來明顯的效能提公升。

3.4 多執行緒併發讀

在客戶端開啟多個htable讀執行緒,每個讀執行緒負責通過htable物件進行get操作。下面是乙個多執行緒併發讀取hbase,獲取店鋪一天內各分鐘pv值的例子:

public class datareaderserver

return parallelbatchminutepv(lst);

}//多執行緒併發查詢,獲取分鐘pv值

private static concurrenthashmap parallelbatchminutepv(list lstkeys)

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(list keys : 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 concurrenthashmap getbatchminutepv(list lstkeys)

result res = null;

try catch (ioexception e1)

if (res != null && res.length > 0)

} catch (exception e2) }}

}return hashret;

}}//呼叫介面類,實現callable介面

class batchminutepvcallable implements callable>

public concurrenthashmap call() throws exception

}3.5 快取查詢結果

對於頻繁查詢hbase的應用場景,可以考慮在應用程式中做快取,當有新的查詢請求時,首先在快取中查詢,如果存在則直接返回,不再查詢hbase;否則對hbase發起讀請求查詢,然後在應用程式中將查詢結果快取起來。至於快取的替換策略,可以考慮lru等常用的策略。

3.6 blockcache

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[的blockcache機制[中的快取的計算與使用[

Hbase效能優化之配置

減少zk 超時時間 建議 1分鐘 rs與zk的 timeout 預設為3 分鐘,由 zookeeper.session.timeout property 決定。也就是說,如果乙個 rs掛了,那麼 master需要3 分鐘之後才能對其進行重啟和恢復。建議調成 1分鐘會更低。然而,你調低之前應該先確保j...

HBase之效能優化 一

1.1 pre creating regions 預設情況下,在建立hbase表的時候會自動建立乙個region分割槽,當匯入資料的時候,所有的hbase客戶端都向這乙個region寫資料,直到這個region足夠大了才進行切分。一種可以加快批量寫入速度的方法是通過預先建立一些空的regions,這...

Hbase效能優化

1 表的設計 1.1 pre creating regions 預設情況下,在建立hbase表的時候會自動建立乙個region分割槽,當匯入資料的時候,所有的hbase客戶端都向這乙個region寫資料,直到這個region足夠大了才進行切分。一種可以加快批量寫入速度的方法是通過預先建立一些空的re...