运维开发网

遇到问题--hbase---java连接hbase报错TTransportException

运维开发网 https://www.qedev.com 2020-04-21 14:50 出处:网络
情况 我们在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.

情况

我们在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,所以查看的它的日志。

可以在控制台查看也可以直接登录服务器查看。

遇到问题--hbase---java连接hbase报错TTransportException

遇到问题--hbase---java连接hbase报错TTransportException

错误如下:

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服务来进行连接。

0

精彩评论

暂无评论...
验证码 换一张
取 消