1. 程式人生 > >遇到問題--hbase---java連線hbase報錯TTransportException

遇到問題--hbase---java連線hbase報錯TTransportException

情況

我們在java中連線hbase報錯。

java的連結程式碼如下:


package com.test.web.controller;

import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.hbase.thrift2.generated.TColumnValue;
import org.apache.hadoop.hbase.thrift2.generated.TGet;
import org.apache.hadoop.hbase.thrift2.generated.THBaseService;
import org.apache.hadoop.hbase.thrift2.generated.TIOError;
import org.apache.hadoop.hbase.thrift2.generated.TPut;
import org.apache.hadoop.hbase.thrift2.generated.TResult;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import java.nio.ByteBuffer;

public class TestHbaseThrift {
public static void main(String[] args) throws TIOError, TException {
System.out.println(“Thrift2 Demo”);
System.out.println(“Usage: DemoClient [host=localhost] [port=9090]”);
System.out.println(“This demo assumes you have a table called \”student\” with a column family called \”info\”“);

    String host = "192.168.30.7";
    int port = 9090;  

    int timeout = 10000;  
    boolean framed = false;  

    TTransport transport = new TSocket(host, port, timeout);  
    if (framed) {  
      transport = new TFramedTransport(transport);  
    }  
    TProtocol protocol = new TBinaryProtocol(transport);  
    // This is our thrift client.  
    THBaseService.Iface client = new THBaseService.Client(protocol);  

    // open the transport  
    transport.open();  

    ByteBuffer table = ByteBuffer.wrap("student".getBytes());  

// TPut put = new TPut();
// put.setRow(“joe”.getBytes());
//
// TColumnValue columnValue = new TColumnValue();
// columnValue.setFamily(“info”.getBytes());
// columnValue.setQualifier(“age,”.getBytes());
// columnValue.setValue(“29”.getBytes());
// List columnValues = new ArrayList();
// columnValues.add(columnValue);
// put.setColumnValues(columnValues);
//
// client.put(table, put);

    TGet get = new TGet();  
    get.setRow("zzq".getBytes());  

    TResult result = client.get(table, get);  

    System.out.print("row = " + new String(result.getRow()));  
    for (TColumnValue resultColumnValue : result.getColumnValues()) {  
      System.out.print(",family = " + new String(resultColumnValue.getFamily()));  
      System.out.print(",q = " + new String(resultColumnValue.getQualifier()));  
      System.out.print(",value = " + new String(resultColumnValue.getValue()));  
      System.out.print(",timestamp = " + resultColumnValue.getTimestamp());  
    }  

    transport.close();  
  }  

}

java控制檯報錯如下:

Exception in thread "main" org.apache.thrift.transport.TTransportException
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:86)
at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:429)
at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:318)
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:219)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:77)
at org.apache.hadoop.hbase.thrift2.generated.THBaseService$Client.recv_get(THBaseService.java:422)
at org.apache.hadoop.hbase.thrift2.generated.THBaseService$Client.get(THBaseService.java:408)
at com.test.web.controller.TestHbaseThrift.main(TestHbaseThrift.java:61)

原因

TTransportException的錯誤原因是很多的,這時候需要去叢集中看看服務端的日誌。
我們連線的是hbase的thiriftserver,所以檢視的它的日誌。
可以在控制檯檢視也可以直接登入伺服器檢視。

錯誤如下:

java.lang.NullPointerException at org.apache.hadoop.hbase.util.Bytes.getBytes(Bytes.java:992)
at org.apache.hadoop.hbase.thrift.ThriftServerRunner$HBaseHandler.get(ThriftServerRunner.java:872)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.hbase.thrift.HbaseHandlerMetricsProxy.invoke(HbaseHandlerMetricsProxy.java:67)
at com.sun.proxy.$Proxy13.get(Unknown Source)
at org.apache.hadoop.hbase.thrift.generated.Hbase$Processor$get.getResult(Hbase.java:4074)
at org.apache.hadoop.hbase.thrift.generated.Hbase$Processor$get.getResult(Hbase.java:4058)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
at org.apache.hadoop.hbase.thrift.TBoundedThreadPoolServer$ClientConnnection.run(TBoundedThreadPoolServer.java:289)
at org.apache.hadoop.hbase.thrift.CallQueue$Call.run(CallQueue.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

這裡查不到什麼資料 也看不出具體的原因

但是我在另一臺伺服器中使用程式碼啟動新的thirift2的服務 是原java程式碼可以連線訪問到的。

hbase thrift2 start

這時候 在訪問異常的伺服器中使用jps檢視是否有thiriftServer服務,發現沒找到。

但是 CDH的控制檯中又是確實存在thiriftServer的服務的,這裡推斷 原因為 thiriftServer的 啟動使用者許可權問題。

或者
thiriftServer的設定問題。

解決方式

因為原伺服器的thiriftServer其他同事也在使用,所以不能進行重新啟動等操作。

針對目前這種情況,只能在另一臺伺服器中新啟動thiriftServer服務來進行連線。