2016-03-07 115 views
2

我正在嘗試運行簡單的Hbase客戶端程序,該程序會與Hbase服務器(獨立)進行通信以創建表和單個行。但是,不幸的是,在運行intelliJ時看到以下異常。Hbase客戶端不連接到本地hbase服務器

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 
Initializing HBaseAdmin 
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. 
Hbase running, Creating table 
Adding data into table 
Exception in thread "main" org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1 action: User: 1 time, 
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.makeException(AsyncProcess.java:205) 
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.access$500(AsyncProcess.java:189) 
at org.apache.hadoop.hbase.client.AsyncProcess.getErrors(AsyncProcess.java:1042) 
at org.apache.hadoop.hbase.client.HTable.backgroundFlushCommits(HTable.java:1037) 
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1352) 
at org.apache.hadoop.hbase.client.HTable.put(HTable.java:963) 
at HbaseSample.main(HbaseSample.java:22) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Done 

客戶端程序:

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.client.HBaseAdmin; 

import org.apache.hadoop.hbase.client.*; 
import org.apache.hadoop.hbase.util.*; 

public class HbaseSample { 
public static void main(String[] args) throws Exception { 
    System.out.println("Initializing HBaseAdmin"); 
    Configuration conf = HBaseConfiguration.create(); 
    conf.set("hbase.zookeeper.property.clientPort","2181"); 
    conf.set("hbase.master", "localhost:60000"); 
    HBaseAdmin admin = new HBaseAdmin(conf); 
    try { 
     HBaseAdmin.checkHBaseAvailable(conf); 
     System.out.println("Hbase running, Creating table"); 
     HTable table = new HTable(conf, "User"); 
     Put put = new Put(Bytes.toBytes("msameer")); 
     put.add(Bytes.toBytes("Info"), Bytes.toBytes("addr"), Bytes.toBytes("walnut creek")); 
     System.out.println("Adding data into table"); 
     table.put(put); 
    } finally { 
     admin.close(); 
     System.out.println("Done"); 
    } 
    } 
} 

我的HBase-site.xml中看起來如下:

<configuration> 
<property> 
    <name>hbase.rootdir</name> 
    <value>file:///Users/msameer/Documents/Hbase/hbase-root</value> 
</property> 
<property> 
    <name>hbase.zookeeper.property.dataDir</name> 
    <value>/Users/msameer/Documents/Hbase/hbase-zookeper</value> 
</property> 
<property> 
    <name>hbase.zookeeper.property.clientPort</name> 
    <value>2181</value> 
</property> 
<property> 
    <name>hbase.master</name> 
    <value>localhost:60000</value> 
</property> 
</configuration> 

任何幫助是非常讚賞。

+0

什麼版本的hbase? –

回答

4

您的桌子是否已經存在?因爲此代碼不會創建表格:

HBaseAdmin.checkHBaseAvailable(conf); 
System.out.println("Hbase running, Creating table"); 
HTable table = new HTable(conf, "User"); 

這將只使用已存在的表。要創建一個表,你需要使用HBaseAdmin

HBaseAdmin.checkHBaseAvailable(conf); 
System.out.println("Hbase running, Creating table"); 
HTableDescriptor des = new HTableDescriptor("User"); 
HBaseAdmin.createTable(des); 

看看在documentation的模式創建。它還顯示更新的API調用。現在不推薦使用以H開頭的類。

+0

非常感謝馬丁,是的表沒有創建。另外,感謝您指出正確的API文檔。 – MSameer

+0

您的歡迎。請注意,如果你願意,你也可以贊成答案。 –

+0

他沒有足夠的聲望去投票。我同意你的回答很有用。 –