Java API 到 HBase 异常 :cannot get location

标签 java hbase apache-zookeeper

我正在尝试使用 JAVA API 连接到 HBase。 我的代码如下所示:

public class Test {
    public static void main(String[] args) throws IOException{
        TableName tableName = TableName.valueOf("TABLE2");

        Configuration conf = HBaseConfiguration.create();
        conf.set("zookeeper.znode.parent", "/hbase-secure");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        conf.set("hbase.zookeeper.quorum", "xxxxxxxxxxxxxx");
        conf.set("hbase.master", "xxxxxxxxxxxxx");

        Connection conn = ConnectionFactory.createConnection(conf);
        Admin admin = conn.getAdmin();
        System.out.println(admin.toString());

        if(!admin.tableExists(tableName)){
            admin.createTable(new HTableDescriptor(tableName).addFamily(new HColumnDescriptor("cf")));
        }

        Table table = conn.getTable(tableName);
        Put p = new Put(Bytes.toBytes("AAPL10232015"));
        p.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("close"), Bytes.toBytes(119));
        table.put(p);

        Result r = table.get(new Get(Bytes.toBytes("AAPL10232015")));
        System.out.println(r);
    }
}

当我在我的集​​群中运行这个程序时,我得到了异常: 我运行了这个并得到了以下错误:

Exception in thread "main" org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the locations
        at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.getRegionLocations(RpcRetryingCallerWithReadReplicas.java:312)
        at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:151)
        at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:59)
        at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200)
        at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:320)
        at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:295)
        at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:160)
        at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:155)
        at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:821)
        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:303)
        at java2hbase.Test.main(Test.java:31)

我在 HDP 集群中运行它,异常发生在 hbaseAdmin 实例化之后。看来JAVA客户端无法使用zookeeper连接到Hbase,但我可以使用命令“hbase zkcli”成功打开shell。

谁知道问题出在哪里?有什么办法可以检查 zookeeper 好不好?感谢您的帮助。

最佳答案

这似乎是集群的问题。您能否确保 HBase 运行良好并且所有区域服务器都正常运行?

请先打开外壳并列出表以确保基本检查.. 另外,检查是否有任何版本不匹配的 jar 。

如果您从下面的集群运行,请务必采用射击方法以避免任何意外。

Configuration conf = HBaseConfiguration.create();
conf.addResource("core-site.xml");
conf.addResource("hbase-site.xml");
conf.addResource("hdfs-site.xml");

还要检查您是否正在以下面的方式运行 java 客户端

# export HADOOP_CLASSPATH=`./hbase classpath`

关于Java API 到 HBase 异常 :cannot get location,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38901460/

相关文章:

java - 字符串的正则表达式,其中某个位置包含一个或多个字母

hadoop - Solr HBase 搜索引擎

hadoop - HBase 区域服务器与数据节点的数量

hadoop - 无法从 ZooKeeper 获取主地址。我在创建 Hbase 表时遇到此错误

apache-zookeeper - master down 时 zookeeper 怎么办

java - 如何根据另一个bean的属性注入(inject)一个bean?

java - Spring 中对 Map 的值进行 URLEncode

apache-spark - 具有太大而无法放入内存的查找表的批处理作业 (Spark)

java - Apache Curator 双重锁定问题与多个服务

java - 在从文本文件中逐行读取的链接列表中按字母顺序对字符串进行排序的更好方法是什么?