将Java远程连接到HBase

将Java远程连接到HBase,java,hbase,Java,Hbase,我正在尝试将Java连接到远程服务器中的HBase 情况如下: java类在我的本地计算机中(192.168.111.165) Hadoop文件系统和HBase位于另一台服务器中(192.168.11.7) 以下是我的Hadoop的core-site.xml(在192.168.11.7中): fs.default.name hdfs://192.168.11.7:9000 以下是我的Hadoop的hdfs-site.xml(在192.168.11.7中): dfs.replication

我正在尝试将Java连接到远程服务器中的HBase

情况如下:

java类在我的本地计算机中(192.168.111.165)

Hadoop文件系统和HBase位于另一台服务器中(192.168.11.7)

以下是我的Hadoop的core-site.xml(在192.168.11.7中):


fs.default.name
hdfs://192.168.11.7:9000
以下是我的Hadoop的hdfs-site.xml(在192.168.11.7中):


dfs.replication
1.
dfs.name.dir
file:///home/hadoop/hadoopinfra/hdfs/namenode
dfs.data.dir
file:///home/hadoop/hadoopinfra/hdfs/datanode
以下是我的HBase的HBase-site.xml(在192.168.11.7中):


hbase.rootdir
hdfs://192.168.11.7:9000/hbase
hbase.zookeeper.property.dataDir
/home/hadoop/zookeeper
hbase.cluster.distributed
真的
我已经成功地打开了HDFS和HBase(经过验证,我可以在HBase shell中运行“list”命令)。请注意,我使用ssh从本地计算机运行HBase Shell中的“list”命令到192.168.11.7。 从我的本地计算机(192.168.111.165),我可以使用浏览器访问hadoop文件系统和hbase(hadoop通过点击URL:,hadoop集群通过点击URL:,hbase通过点击URL:)

现在,我在本地计算机(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>

hbase.rootdir
hdfs://192.168.11.7:9000/hbase
我的主要代码如下:

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.");
    }
}
私有静态配置conf=null;
公共静态void main(字符串[]args)引发异常{
试一试{
conf=HBaseConfiguration.create();
String tablename=“分数”;
字符串[]家庭={“年级”,“课程”};
creatTable(表名、家庭);
}捕获(例外e){
e、 printStackTrace();
投掷e;
}
}
public void createTable(字符串tableName,字符串[]familys)
抛出异常{
HBaseAdmin admin=新的HBaseAdmin(conf);
如果(admin.tableExists(tableName)){
System.out.println(“表已经存在!”);
}否则{
HTableDescriptor tableDesc=新的HTableDescriptor(tableName);
对于(int i=0;i
当我运行代码时,我得到一个异常,它有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)
org.apache.hadoop.hbase.client.retriesHaustedException:无法获取位置
位于org.apache.hadoop.hbase.client.rpcretryingcallerwithreadreplications.getRegionLocations(rpcretryingcallerwithreadreplications.java:319)
位于org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:156)
位于org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:60)
位于org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:210)
位于org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:326)
位于org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:301)
位于org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:166)
位于org.apache.hadoop.hbase.client.ClientScanner.(ClientScanner.java:161)
位于org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:797)
位于org.apache.hadoop.hbase.MetaTableAccessor.fullScan(MetaTableAccessor.java:602)
位于org.apache.hadoop.hbase.MetaTableAccessor.tableExists(MetaTableAccessor.java:366)
位于org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:406)
位于org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:416)
在com.volt.kismistest.handler.TestHBaseHandler.creatTable(TestHBaseHandler.java:82)上
位于com.volt.kismistest.handler.TestHBaseHandler.doAction(TestHBaseHandler.java:47)
位于com.volt.kismistest.handler.TestHBaseHandler.doAction(TestHBaseHandler.java:1)
例外情况中的注意事项是:

TestHBaseHandler是我的java类的名称

java:82是:如果(admin.tableExists(tableName)){在createTable方法上

java:47是:createTable(tablename,familys);在main方法上

有人能帮我解决这个问题吗


非常感谢

您说过您可以运行
列表
,但是您可以在特定的表上运行
创建
扫描
吗?您可能忘记启动区域服务器。我会运行类似以下的操作:

create testtable,{NAME=>'testcf'}
查看它是否也在shell中创建了它。如果它以某种方式工作,请运行
scan'testtable'
以验证是否可以扫描它

也可能是防火墙问题。区域服务器可能已启动,但其端口已防火墙关闭


另一件事,您也可以打电话检查HBase是否已启动并从您的客户端运行。

您说过您可以运行
list
,但是您可以在特定的表上运行
create
scan
?您可能忘记启动区域服务器。我会这样运行:

create testtable,{NAME=>'testcf'}
查看它是否也在shell中创建了它。如果它以某种方式工作,请运行
scan'testtable'
以验证是否可以扫描它

也可能是防火墙问题。区域服务器可能已启动,但其端口已防火墙关闭


另外,您还可以打电话检查HBase是否已从客户端启动并运行。

此处仅作猜测,因为许多问题可能取决于HBase的安装方式/位置或网络配置

在HBase中,大部分工作由从属节点完成,而主节点只是您的主要“联系点”。大多数情况下,您会点击主节点,而主节点只会返回从属节点(它)的IP
<?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.");
    }
}
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)