2
我目前正試圖找到一種方法來處理我的應用程序中意外的HBase故障。更具體地說,我試圖解決的是我的應用程序向HBase插入數據然後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的服務器後。什麼是異步HBase的客戶打印到我,如果我實際打印堆棧跟蹤在「onFailure處」的方法是:
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)
所以我的問題是:
- 應該怎樣一個處理像我的情況提到使用指定的異步客戶端?
- 如果這個異步客戶端不再相關可以有人建議一個不同的異步客戶端,可以執行異步投入?我試過BufferedMutator,但它似乎並沒有真正刷新任何內容,而只是失敗與以下
java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator
(但這樣會稍微題外話所以我不會再擴大)
感謝
我不是100%確定如果我的迴應應該是答案,但基本上我發現,在我的情況下去使用HBase的高可用性。這使得我的異步客戶端在其中一個主服務器失敗時不會失敗。希望這會幫助任何人 – Gideon