gpt4 book ai didi

java - 在 hbase 中有效地发送许多 get 请求

转载 作者:可可西里 更新时间:2023-11-01 15:01:17 30 4
gpt4 key购买 nike

我正在尝试在 Java 中创建一个通用方法来查询 hbase

我目前写了一篇接受 3 个参数的文章

  • 一个Range(扫描表格)
  • (待返回)...和
  • 条件(即browser==Chrome)

所以一条语句(如果用 SQLish 语言编写)可能看起来像

SELECT OS FROM TABLE WHERE BROWSER==CHROME IN RANGE (5 WEEKS AGO -> 2 WEEKS AGO)

现在,我知道我没有正确使用 HBase(对 rowkey 等使用常见的列查询),但为了实验,我想尝试一下,以帮助我学习。

所以我做的第一件事是在 Scan 上设置一个 Range。 (5 周到 2 周前),因为 rowkeytimestamp,所以效率很高。

然后我设置了一个 SingleColumnValueFilter (browser = Chrome)(在范围过滤器之后,这非常快)

然后我将所有行键(来自扫描)存储到一个数组中。

对于每个 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();
}

最佳答案

Given my circumstances, what is the most efficient way to perform these GETs, or am I totally approaching it incorrectly?

我会建议以下方式

如果您知道可以预先访问哪些行键,那么 Get 就很好。

在这种情况下,您可以使用如下方法,它将返回结果数组。

/**
* 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 权威指南 --> Client API: Advanced Features

关于java - 在 hbase 中有效地发送许多 get 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876718/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com