java—使用异步hbase客户端从hbase服务器故障中恢复

llmtgqce  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(417)

我目前正试图找到一种方法来处理我的应用程序中意外的hbase故障。更具体地说,我要解决的问题是,我的应用程序将数据插入hbase,然后hbase失败并重新启动。
为了检查我的应用程序对该场景的React,我编写了一个应用程序,通过执行紧密循环并将结果保存在hbase中来使用hbase异步客户机。当我启动应用程序时,我可以看到行被保存到表中,如果在此期间我故意使我的hbase服务器失败并重新启动它,那么客户端似乎会重新连接,但新的插入不会保存到表中
代码如下所示:

HConnection connection = HConnectionManager.createConnection();
HBaseClient hbaseClient = new HBaseClient(connection);

IntStream.range(0, 10000)
                .forEach(new IntConsumer() {
                    @Override
                    public void accept(int value) {
                        try {
                            System.out.println("in value: " + value);
                            Thread.sleep(2000);
                            Get get = new Get(Bytes.toBytes("key"));
                            hbaseClient.get(TableName.valueOf("testTable"), get, new ResponseHandler<Result>() {
                                            @Override
                                                public void onSuccess(Result response) {
                                                    System.out.println("SUCCESS");
                                                }

                                @Override
                                public void onFailure(IOException e) {
                                    System.out.println("FAILURE");
                                }
                            });
                            urlsClient.save("valuekey", "w" + value, new FailureHandler<IOException>() {
                                @Override
                                public void onFailure(IOException failure) {
                                    System.out.println("FAILURE");
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });

这显然只是一个简单的测试,但我要实现的是,在我重新启动hbase服务器之后,异步客户机将成功地保存新行。如果我在“onfailure”方法中实际打印stacktrace,异步hbase客户端将打印给我的是:

org.apache.hadoop.hbase.ipc.RpcClient$CallTimeoutException: Call id=303, waitTime=60096, rpcTimeout=60000
    at org.apache.hadoop.hbase.ipc.AsyncRpcChannel.cleanupCalls(AsyncRpcChannel.java:612)
    at org.apache.hadoop.hbase.ipc.AsyncRpcChannel$1.run(AsyncRpcChannel.java:119)
    at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
    at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
    at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
    at java.lang.Thread.run(Thread.java:745)

所以我的问题是:
应该如何处理我提到的使用指定的异步客户机的情况?
如果此异步客户机不再相关,是否有人可以建议另一个可以执行异步put的异步客户机?我尝试了bufferedmutator,但它似乎并没有真正刷新任何内容,只是出现了以下问题 java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator (但这有点离题了,所以我不再赘述)
谢谢

sqyvllje

sqyvllje1#

我问这个问题已经很久了,但我最终还是使用了hbase高可用性,而没有找到用代码解决问题的方法

相关问题