Gre*_*ory 1 java multithreading hadoop hbase
我正在尝试创建Java
用于查询的通用方法hbase
。
我目前有一篇写有3个论点的书
Range
(扫描表)Column
(要退货)...和Condition
(即browser==Chrome
)因此,一条语句(如果使用SQLish语言编写)可能看起来像
SELECT OS FROM TABLE WHERE BROWSER==CHROME IN RANGE (5 WEEKS AGO -> 2 WEEKS AGO)
Run Code Online (Sandbox Code Playgroud)
现在,我知道我没有HBase
正确使用(对rowkey使用常见的列查询等),但是为了进行实验,我想尝试一下以帮助我学习。
因此,我要做的第一件事是在Range
上设置Scan
。(5周到2周前),由于rowkey
是timestamp
,因此非常有效。
然后设置一个SingleColumnValueFilter
(browser = Chrome
)(在范围过滤器之后,这非常快)
然后,将所有rowkeys
(来自扫描)存储到array
。
对于每个rowkey
(在数组中),我执行一个GET
操作以获取对应的OS
。
我尝试使用MultiGet
,这大大加快了过程。
然后GET
,我尝试使用普通请求,每个请求都产生一个新线程,这些线程同时运行,从而将查询时间减少了一半!但是仍然不够快。
我考虑过使用与数据库的单个连接来限制线程数。即-每个连接100个线程。
考虑到我的情况,执行这些GET
s 的最有效方法是什么,还是我完全不正确地采用它?
任何帮助深表感谢。
编辑(这是我的线程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();
}
Run Code Online (Sandbox Code Playgroud)
考虑到我的情况,执行这些GET的最有效方法是什么,还是我完全不正确地使用它?
我建议以下方式
如果您知道可以预先使用哪些行键,则Get效果很好。
在这种情况下,您可以使用如下方法,它将返回Result数组。
/**
* Method getDetailRecords.
*
* @param listOfRowKeys List<String>
* @return Result[]
* @throws IOException
*/
private Result[] getDetailRecords(final List<String> listOfRowKeys) throws IOException {
final HTableInterface table = HBaseConnection.getHTable(TBL_DETAIL);
final List<Get> listOFGets = new ArrayList<Get>();
Result[] results = null;
try {
for (final String rowkey : listOfRowKeys) {// prepare batch of get with row keys
// System.err.println("get 'yourtablename', '" + saltIndexPrefix + rowkey + "'");
final Get get = new Get(Bytes.toBytes(saltedRowKey(rowkey)));
get.addColumn(COLUMN_FAMILY, Bytes.toBytes(yourcolumnname));
listOFGets.add(get);
}
results = table.get(listOFGets);
} finally {
table.close();
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
附加说明:行过滤器始终比列值过滤器(进行全表扫描)要快。
建议通过hbase-the-definitive指南-> 客户端API:高级功能