2016-05-29 2 views
2

В настоящее время я пытаюсь найти способ справиться с неожиданными сбоями 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 (но это становится немного не по теме, так я не буду расширяться больше)

Благодаря

+1

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

ответ

0

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

Смежные вопросы