我目前正试图找到一种方法来处理应用程序中意外的HBase故障。更具体地说,我正在尝试解决的问题是我的应用程序将数据插入HBase然后HBase失败并重新启动。
为了检查我的应用程序对该场景的反应,我编写了一个使用HBase Async client的应用程序,通过紧急循环并将结果保存在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”方法中打印堆栈跟踪,异步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)
所以我的问题是:
java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator
(但这有点偏离主题所以我不再扩展)由于
答案 0 :(得分:0)
自从我提出这个问题以来已经有很长一段时间但我最终使用HBase高可用性而不是找到一种方法来解决它的代码