2016-03-07 116 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

他没有足够的声望去投票。我同意你的回答很有用。 –