我试图将Java连接到远程服务器中的HBase。
情况如下:
java类在我的本地计算机(192.168.111.165)
中Hadoop文件系统和HBase位于另一台服务器(192.168.11.7)
这是我的Hadoop核心站点文件(在192.168.11.7中):
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.11.7:9000</value>
</property>
</configuration>
这是我的Hadoop的hdfs-site.xml(在192.168.11.7中):
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
</property>
</configuration>
这是我的HBase的hbase-site.xml(在192.168.11.7中):
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.11.7:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>
我已经成功启用了HDFS和HBase(证明我可以在HBase shell中运行&#34; list&#34;命令)。请注意,我运行&#34;列表&#34; HBase Shell中的命令,使用ssh到我本地计算机的192.168.11.7。 从我的本地计算机(192.168.111.165),我可以使用浏览器访问hadoop文件系统和hbase(通过点击URL访问hadoop:http://192.168.11.7:50070/,通过点击URL访问hadoop集群:http://192.168.11.7:8088/,通过点击URL来访问HBase:{ {3}})
现在,我在本地计算机(192.168.111.165)中开发了一个Java代码,该代码具有hbase-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.11.7:9000/hbase</value>
</property>
</configuration>
和我的主要代码如下:
private static Configuration conf = null;
public static void main(String[] args) throws Exception {
try {
conf = HBaseConfiguration.create();
String tablename = "scores";
String[] familys = { "grade", "course" };
creatTable(tablename, familys);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public void creatTable(String tableName, String[] familys)
throws Exception {
HBaseAdmin admin = new HBaseAdmin(conf);
if (admin.tableExists(tableName)) {
System.out.println("table already exists!");
} else {
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
for (int i = 0; i < familys.length; i++) {
tableDesc.addFamily(new HColumnDescriptor(familys[i]));
}
admin.createTable(tableDesc);
System.out.println("create table " + tableName + " ok.");
}
}
当我运行代码时,我得到了Exception,它有stacktrace:
org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the locations
at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.getRegionLocations(RpcRetryingCallerWithReadReplicas.java:319)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:156)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:60)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:210)
at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:326)
at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:301)
at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:166)
at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:161)
at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:797)
at org.apache.hadoop.hbase.MetaTableAccessor.fullScan(MetaTableAccessor.java:602)
at org.apache.hadoop.hbase.MetaTableAccessor.tableExists(MetaTableAccessor.java:366)
at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:406)
at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:416)
at com.volt.kismistest.handler.TestHBaseHandler.creatTable(TestHBaseHandler.java:82)
at com.volt.kismistest.handler.TestHBaseHandler.doAction(TestHBaseHandler.java:47)
at com.volt.kismistest.handler.TestHBaseHandler.doAction(TestHBaseHandler.java:1)
注意例外是:
TestHBaseHandler是我的java类的名称
TestHBaseHandler.java:82是: if(admin.tableExists(tableName)){ on creatTable方法
TestHBaseHandler.java:47是:主方法 creatTable(tablename,familys);
有人可以帮我解决这个问题吗?
非常感谢
答案 0 :(得分:1)
您说您可以投放run()
,但是您可以在特定的桌面上投放list
和create
吗?您可能忘记启动区域服务器。我会运行这样的事情:
scan
查看是否也在shell中创建了它。如果以某种方式工作,请运行create testtable, {NAME => 'testcf'}
以验证您是否可以扫描它。
也可能是防火墙问题。区域服务器可能已启动,但其端口已防火墙。
另外,您还可以致电HBaseAdmin#available来检查HBase是否已启动并运行在您的客户端。
答案 1 :(得分:1)
这里只是猜测,因为许多问题可能取决于HBase的安装方式/位置或网络配置。
在HBase中,大部分工作由从属节点完成,主节点只是您的主要联系点。大多数情况下,你会点击主控器,它将只返回从属节点的IP(它可能非常好的内部IP ),它应该完成操作(读/写为当然,也可能是创建表)。如果您的客户端无法解析或无法访问该从属IP,则可能会遇到连接问题。您获得的例外情况可能会有所不同。
要尝试的事情:
list
是不够的,因为它可能仅由主节点提供......