2016-05-29 37 views
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(但這樣會稍微題外話所以我不會再擴大)

感謝

+1

我不是100%確定如果我的迴應應該是答案,但基本上我發現,在我的情況下去使用HBase的高可用性。這使得我的異步客戶端在其中一個主服務器失敗時不會失敗。希望這會幫助任何人 – Gideon

回答

0

它已經相當很長一段時間,因爲我問這個問題,但我最終使用HBase的高可用性,而不是找到一種方法來解決它的代碼