1. 程式人生 > >解決java連線Hbase程式卡住執行也不報錯的問題

解決java連線Hbase程式卡住執行也不報錯的問題

問題描述:

最近在hadoop叢集上搭建好Hbase,用hbase shell進行增刪改查操作都沒有問題,但是用java API來對hbase進行操作卻出現一個很奇怪的問題,就是執行java程式後沒有任何反應,程式也不報錯。

首先貼出我的測試程式碼:

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

public class Test {

private static Configuration conf=HBaseConfiguration.create();
	
	static {
		conf=HBaseConfiguration.create();
//註釋部分如果在本地測試不需要加,要是遠端連線Hbase需要制定hbase地址
//		conf.set("hbase.master", "master:60000");
//		conf.set("hbase.zookeeper.quorum","slave,slave2,slave3");
		System.out.println(conf.get("hbase.master"));
	}
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		
		HTable table = new HTable(conf,"test1");
		Scan s = new Scan();
		ResultScanner rs = table.getScanner(s);
		for(Result res:rs)
		{
			System.out.println(res);
		}
		table.close();
	}

}
執行程式,發現程式並沒有輸出查到的表內的值,奇怪的是程式不報任何異常,也不產生輸出,所以應該是卡住了,除錯程式發現,程式會卡在
ResultScanner rs = table.getScanner(s);

這句話,應該是呼叫HTable的方法問題,檢視zookeeper日誌後發現,程式一直在嘗試連線hbase,但是timeout,也就是連線超時,程式不斷嘗試,所以會出現卡住的現象。

而且檢視Hbase-master日誌發現沒有任何寫入,說明程式根本還沒執行到要用到hbase的時候就已經卡住了,也側面印證了我的Hbase配置是沒有問題的。所以我判斷是java連線Hbase過程出了問題。

接下來的幾天我一直在查,但是一直沒有解決,但是又一次我執行程式卡住之後,沒退出程式就走了,等很久我回來時,發現程式報錯了!(應該是長時間嘗試連線,達到了設定的timeout最大值)

報錯如下:

log4j:WARN No appenders could be found for logger (org.apache.hadoop.security.Groups).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.net.SocketTimeoutException: callTimeout=1200000, callDuration=19813388: row '' on table 'TEST1' at null
	at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:143)
	at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:91)
	at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:289)
	at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:190)
	at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:185)
	at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:111)
	at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:780)
	at hbasetest.Test.main(Test.java:33)
Caused by: java.io.IOException: com.google.protobuf.ServiceException: java.lang.NoClassDefFoundError: com/yammer/metrics/core/Gauge
	at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRemoteException(ProtobufUtil.java:300)
	at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRowOrBefore(ProtobufUtil.java:1564)
	at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRowOrBefore(ProtobufUtil.java:1540)
	at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:1337)
	at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1179)
	at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1136)
	at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionLocation(HConnectionManager.java:977)
	at org.apache.hadoop.hbase.client.RegionServerCallable.prepare(RegionServerCallable.java:74)
	at org.apache.hadoop.hbase.client.ScannerCallable.prepare(ScannerCallable.java:125)
	at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:114)
	... 7 more
Caused by: com.google.protobuf.ServiceException: java.lang.NoClassDefFoundError: com/yammer/metrics/core/Gauge
	at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1709)
	at org.apache.hadoop.hbase.ipc.RpcClient$BlockingRpcChannelImplementation.callBlockingMethod(RpcClient.java:1750)
	at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.get(ClientProtos.java:31612)
	at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRowOrBefore(ProtobufUtil.java:1560)
	... 15 more
Caused by: java.lang.NoClassDefFoundError: com/yammer/metrics/core/Gauge
	at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1689)
	... 18 more
Caused by: java.lang.ClassNotFoundException: com.yammer.metrics.core.Gauge
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 19 more

發現是找不到包的異常,因為我之前都是按照網上很多帖子去導的jar包,很多帖子寫的依賴包都大同小異,沒什麼差別,後來通過大量搜尋,找到了問題,是程式缺少了一個叫:“metrics-core-2.2.0.jar”的包(此jar包可在$HBASE_HOME/lib下找到),build path該包,在執行程式,執行成功:
master:60000
log4j:WARN No appenders could be found for logger (org.apache.hadoop.security.Groups).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
keyvalues={1/personinfo:name/1462411628085/Put/vlen=6/mvcc=0, 1/personinfo:sex/1462411628085/Put/vlen=3/mvcc=0}
keyvalues={2/personinfo:name/1462411628085/Put/vlen=6/mvcc=0, 2/personinfo:sex/1462411628085/Put/vlen=3/mvcc=0}
keyvalues={3/personinfo:name/1462411625239/Put/vlen=6/mvcc=0}
keyvalues={4/personinfo:name/1462411623526/Put/vlen=6/mvcc=0, 4/personinfo:sex/1462411623526/Put/vlen=3/mvcc=0}
keyvalues={5/personinfo:name/1462411628403/Put/vlen=6/mvcc=0, 5/personinfo:sex/1462411628403/Put/vlen=3/mvcc=0}
keyvalues={6/personinfo:name/1462411628403/Put/vlen=6/mvcc=0}