遇到問題--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服務來進行連線。