В настоящее время я пытаюсь найти способ справиться с неожиданными сбоями HBase в моем приложении. Более конкретно, то, что я пытаюсь решить, - это случай, когда мое приложение вставляет данные в HBase, а затем HBase завершается с ошибкой и перезапускается.Восстановление с отказа сервера HBase с использованием клиента Async 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)
И вот мои вопросы:
- Как следует одна сделка с ситуацией, как я указанным с использованием указанного асинхронного клиента?
- Если этот асинхронный клиент больше не подходит, кто-то может предложить другой асинхронный клиент, который может выполнять асинхронные puts? Я попробовал 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