我試圖在Java
中爲hbase
創建一個通用方法。在hbase中高效發送多個獲取請求
我現在有一個寫它接受3個參數
- 一個
Range
(掃描表) - 一個
Column
(回)...和 - 一個
Condition
(即browser==Chrome
)
因此,一個語句(if寫在一個SQLish語言)可以像
SELECT OS FROM TABLE WHERE BROWSER==CHROME IN RANGE (5 WEEKS AGO -> 2 WEEKS AGO)
現在,我知道我沒有正確使用HBase
(對rowkey等使用常見列查詢),但爲了實驗的目的,我想嘗試一下,以幫助我學習。
所以我做的第一件事就是在Scan
上設置一個Range
。 (5周到2周前),因爲rowkey
是timestamp
,這是非常有效的。
然後我設置SingleColumnValueFilter
(browser = Chrome
)(的範圍濾波器後,這是相當快)
然後我存儲所有的rowkeys
(從掃描)轉換成array
。
對於每個rowkey
(在數組中)我執行GET
操作以獲得相應的OS
。
我試過使用MultiGet
,這加快了這個過程。
然後我嘗試使用正常的GET
請求,每個請求產生一個新的線程,所有的線程都同時運行,這減少了一半的查詢時間!但仍然不夠快。
我已經考慮限制使用單個連接到數據庫的線程數。即每個連接100個線程。
鑑於我的情況,執行這些GET
s的最有效方法是什麼?或者我完全錯誤地接近它?
任何幫助非常感謝。
EDIT(這是我的螺紋GET
嘗試)
List<String> newresults = Collections.synchronizedList(new ArrayList<String>());
for (String rowkey : result) {
spawnGetThread(rowkey, colname);
}
public void spawnGetThread(String rk, String cn) {
new Thread(new Runnable() {
public void run() {
String rt = "";
Get get = new Get(Bytes.toBytes(rk));
get.addColumn(COL_FAM, cn);
try {
Result getResult = tb.get(get);
rt = (Bytes.toString(getResult.value()));
} catch (IOException e) {
}
newresults.add(rt);
}
}).start();
}
此外,請參閱此問題http://stackoverflow.com/questions/26880169/timestamp-based-scans-in-hbase可能會有所幫助 –