在hbase

时间:2016-08-10 14:47:18

标签: 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)

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

所以我要做的第一件事是在Range上设置Scan。 (5周到2周前),因为rowkeytimestamp,这非常有效。

然后我设置SingleColumnValueFilterbrowser = 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();
}

1 个答案:

答案 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