在HBase中高效发送许多获取请求

Gre*_*ory 1 java multithreading hadoop hbase

我正在尝试创建Java用于查询的通用方法hbase

我目前有一篇写有3个论点的书

  • A Range(扫描表)
  • A Column(要退货)...和
  • A 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周前),由于rowkeytimestamp,因此非常有效。

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

然后,将所有rowkeys(来自扫描)存储到array

对于每个rowkey(在数组中),我执行一个GET操作以获取对应的OS

我尝试使用MultiGet,这大大加快了过程。

然后GET,我尝试使用普通请求,每个请求都产生一个新线程,这些线程同时运行,从而将查询时间减少了一半!但是仍然不够快。

我考虑过使用与数据库的单个连接来限制线程数。即-每个连接100个线程。

考虑到我的情况,执行这些GETs 的最有效方法是什么,还是我完全不正确地采用它?

任何帮助深表感谢。

编辑(这是我的线程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)

Ram*_*ram 5

考虑到我的情况,执行这些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:高级功能