我尝试在Java
中创建用于查询hbase
的通用方法。
我目前有一篇文章,其中包含3个参数
Range
(扫描表格)Column
(将被退回)......和Condition
(即browser==Chrome
)所以声明(如果用SQLish语言编写)可能看起来像
SELECT OS FROM TABLE WHERE BROWSER==CHROME IN RANGE (5 WEEKS AGO -> 2 WEEKS AGO)
现在,我知道我没有正确使用HBase
(使用常见的列查询等等),但为了实验,我想尝试一下,以帮助我学习
所以我要做的第一件事是在Range
上设置Scan
。 (5周到2周前),因为rowkey
是timestamp
,这非常有效。
然后我设置SingleColumnValueFilter
(browser = Chrome
)(在范围过滤器之后,这非常快)
然后我将所有rowkeys
(从扫描中)存储到array
。
对于每个rowkey
(在数组中),我执行GET
操作以获取相应的OS
。
我尝试过使用MultiGet
,这加快了这个过程。
然后我尝试使用普通GET
请求,每个请求产生一个新线程,所有这些请求都会同时运行,这会使查询时间缩短一半!但仍然不够快。
我考虑过限制使用单个数据库连接的线程数。即 - 每个连接100个线程。
根据我的情况,执行这些GET
的最有效方法是什么,还是我完全接近它?
非常感谢任何帮助。
编辑(这是我的线程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();
}
答案 0 :(得分:5)
根据我的情况,最有效的方法是什么 这些GET,还是我完全不正确地接近它?
我会建议以下方式
如果您知道可以预先使用哪些rowkeys,那就很好。
在这种情况下,您可以使用如下方法,它将返回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;
}
附加说明:行过滤器总是比列值过滤器更快(全表扫描)...
建议通过hbase-the-definitive guide - &gt; Client API: Advanced Features