Восстановление после сбоя сервера HBase с помощью клиента Async HBase

В настоящее время я пытаюсь найти способ справиться с неожиданными сбоями HBase в моем приложении. Точнее, то, что я пытаюсь решить, — это случай, когда мое приложение вставляет данные в HBase, а затем HBase дает сбой и перезапускается.

Чтобы проверить, как мое приложение реагирует на этот сценарий, я написал приложение, которое использует клиент HBase Async выполнив замкнутый цикл и сохранив результаты в 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 (но это немного не по теме, поэтому я больше не буду расширяться)

Спасибо


person Gideon    schedule 29.05.2016    source источник
comment
Я не уверен на 100%, должен ли мой ответ быть ответом, но в основном я обнаружил, что в моем случае нужно использовать высокую доступность HBase. Это помогло моему асинхронному клиенту не выйти из строя, когда один из мастеров вышел из строя. Надеюсь, это поможет любому   -  person Gideon    schedule 30.06.2016


Ответы (1)


Прошло довольно много времени с тех пор, как я задал этот вопрос, но в итоге я использовал высокую доступность HBase вместо того, чтобы найти способ решить ее с помощью кода.

person Gideon    schedule 13.12.2016