java - Hbase批量获取和SocketTimeoutException

标签 java hbase

我使用 java,我想像这样进行批处理

final List<Get> gets = uids.stream()
                .map(uid -> new Get(toBytes(uid)))
                .collect(Collectors.toList());

Configuration configuration = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", quorum);
conf.set("hbase.zookeeper.property.clientPort", properties.getString("HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT"));
conf.set("zookeeper.znode.parent", properties.getString("HBASE_CONFIGURATION_ZOOKEEPER_ZNODE_PARENT"));

HTable table = new HTable(configuration, tableName);
return table.get(gets);

当获取列表有10K时获取一切正常。

当我尝试在一批中获取 100K 时,出现异常:

java.lang.RuntimeException: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 100000 actions: SocketTimeoutException: 100000 times, 
Caused by: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 100000 actions: SocketTimeoutException: 100000 times, 
        at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.makeException(AsyncProcess.java:203) ~[hbase-query-layer-r575958b.jar:?]
        at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.access$500(AsyncProcess.java:187) ~[hbase-query-layer-r575958b.jar:?]
        at org.apache.hadoop.hbase.client.AsyncProcess.getErrors(AsyncProcess.java:922) ~[hbase-query-layer-r575958b.jar:?]
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatchCallback(HConnectionManager.java:2402) ~[hbase-query-layer-r575958b.jar:?]
        at org.apache.hadoop.hbase.client.HTable.batchCallback(HTable.java:868) ~[hbase-query-layer-r575958b.jar:?]
        at org.apache.hadoop.hbase.client.HTable.batchCallback(HTable.java:883) ~[hbase-query-layer-r575958b.jar:?]
        at org.apache.hadoop.hbase.client.HTable.batch(HTable.java:858) ~[hbase-query-layer-r575958b.jar:?]
        at org.apache.hadoop.hbase.client.HTable.get(HTable.java:825) ~[hbase-query-layer-r575958b.jar:?]
        at hbase_query_layer.hbase.HbaseConnector.get(HbaseConnector.java:89) ~[hbase-query-layer-r575958b.jar:?]
        ... 15 more

怎么了?

此外,我看到(在 Web 界面中)对区域服务器(存储表的位置)的请求增长(批量大小为 100K,几分钟后我看到请求计数为 700K 并且仍在增长,但只有我的客户写某事到这张表)。

此外,我在 hbase-hbase-regionserver.out 中看到了关于 hbase regionserver

Exception in thread "RpcServer.handler=25,port=60020" java.lang.StackOverflowError
        at org.apache.hadoop.hbase.CellUtil$1.advance(CellUtil.java:203)
        at org.apache.hadoop.hbase.CellUtil$1.advance(CellUtil.java:203)

如何解决?

最佳答案

我发现问题:https://issues.apache.org/jira/browse/HBASE-11813

不幸的是,我有 HBase 版本 0.98.0.2.1.1.0-385-hadoop2,所以我需要创建如下 block :

final List<List<Increment>> batchesToExecute = chopped(increments, conf.getBatchIncrementSize());


static <T> List<List<T>> chopped(List<T> list, final int L) {
    List<List<T>> parts = new ArrayList<>();
    final int N = list.size();
    for (int i = 0; i < N; i += L) {
        parts.add(new ArrayList<>(list.subList(i, Math.min(N, i + L))));
    }
    return parts;
}

关于java - Hbase批量获取和SocketTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31310609/

相关文章:

java - 在带有HBase的hadoop中使用外部jar

java - Jython 中的 HBase Bytes.toString(byte[] b) 结果无效

database-design - HBase 列限定符限制

java - 如何从同步映射java将映射条目添加到同步/非同步映射

java - API 易于扩展或覆盖

java - AndEngine粒子系统

scalability - 使用 Thrift 在集群上扩展 HBase 写入

java - 为什么这段代码在我的系统上运行良好并在 HackerRank 中抛出 EmptyStackException

java - SSO spring kerberos 中的注销功能

hadoop - hbase standalone 和 zookeeper standalone 在一台机器上