Storm-hbase螺栓在DRPC上失败

时间:2016-10-13 08:56:25

标签: hbase apache-storm

我正在编写一个Storm拓扑来使用DRPC从HBase读取数据。本质上,这会执行扫描以获取数据,丰富数据并将其返回。

我可以很容易地获得一个基本的DRPC示例(基于http://storm.apache.org/releases/current/Distributed-RPC.html)。但是,当我插入扫描代码时,该过程需要很长时间。一分钟后,我收到以下错误:

backtype.storm.generated.DRPCExecutionException

at backtype.storm.daemon.drpc $ service_handler $ reify__8688.failRequest(drpc.clj:136)〜[storm-core-0.10.0.2.4.2.0-258.jar:0.10.0.2.4.2.0- 258]

at backtype.storm.drpc.DRPCSpout.fail(DRPCSpout.java:241)〜[storm-core-0.10.0.2.4.2.0-258.jar:0.10.0.2.4.2.0-258

不久之后,我得到了org.apache.hadoop.hbase.client.RetriesExhaustedException。这并不总是发生,但很常见。我基于此的假设是两种可能性之一:

扫描超时。但是,在不到一秒的时间内通过HBase Shell或REST执行扫描 该表不一致,导致某个区域丢失。我运行了hbase hbck,它显示0不一致。 我知道与HBase的连接很好:我已经添加了调试输出,并且bolt获得了结果。但是由于DRPCExecutionException,这些结果永远不会通过DRPC返回。

我虽然问题是DRPC超时,但是我已经大量增加了DRPC超时,并且在相同的时间内得到了相同的结果。谷歌搜索后,我发现其他人有同样的问题([Storm][DRPC] Request failed),但没有迹象表明如何解决这个问题。

作为参考,我在下面添加我的代码:

try (Table table = HbaseClient.connection().getTable(TableName.valueOf("EPG_URI"))) 
    {
        List<Filter> filters = new ArrayList<>();
        String startRowString = "start";
        String endRowString = "end";
        RowFilter startRow = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryPrefixComparator(startRowString.getBytes()));
        filters.add(startRow);
        RowFilter endRow = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryPrefixComparator(endRowString.getBytes()));
        filters.add(endRow);
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);

        Scan scan = new Scan();
        scan.addFamily("f1".getBytes());
        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) 
        {
            hbaseValues.add(result);
        }
    }
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

好的,所以我不知道为什么会出现最初的问题,但我通过大量简化扫描仪来解决这个问题:

Scan scan = new Scan(startRowString.getBytes(), endRowString.getBytes());
scan.addFamily("f1".getBytes());
ResultScanner scanner = table.getScanner(scan);            
for (Result r : scanner)
{...}

基于此,问题似乎是在HBase方面,而不是Storm。