尝试连接到HBase时出现java.lang.NumberFormatException

时间:2018-06-01 01:20:59

标签: java hbase apache-zookeeper

我正在设置HBase配置new HBaseGraphConfiguration().set("hbase.zookeeper.quorum", ZOOKEPER_QORUM_NODE)

ZOOKEPER_QORUM_NODE = "172.31.17.251:2181,172.31.17.252:2181,172.31.17.253:2181";

但是它会抛出java.lang.NumberFormatException,错误的一部分是

Caused by: java.lang.NumberFormatException: For input string: "2181]"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Integer.parseInt(Integer.java:580)
  at java.lang.Integer.parseInt(Integer.java:615)
  at org.apache.zookeeper.client.ConnectStringParser.<init>(ConnectStringParser.java:72)

错误行之前的控制台输出

2018-05-30 14:40:52 INFO  org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=[172.31.17.251:2181, 172.31.17.252:2181, 172.31.17.253:2181] sessionTimeout=180000 watcher=hconnection-0x25a65b770x0, quorum=[172.31.17.251:2181, 172.31.17.252:2181, 172.31.17.253:2181], baseZNode=/hbase
2018-05-30 14:40:52 INFO  org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=[172.31.17.251:2181, 172.31.17.252:2181, 172.31.17.253:2181] sessionTimeout=180000 watcher=hconnection-0x25a65b770x0, quorum=[172.31.17.251:2181, 172.31.17.252:2181, 172.31.17.253:2181], baseZNode=/hbase

如何解决?

2 个答案:

答案 0 :(得分:1)

您可以尝试围绕此进行调试的一些建议:

首先,您可以专门为客户端端口提供单独的属性,而不是使用IP:port表示法:hbase.zookeeper.property.clientPort因此请尝试单独提供这两个参数 - 一个以逗号分隔的列表地址和第二个参数只是这一个数字(我把它作为字符串传递,所以"2181"

其次,重要提示:一般来说,请注意提供IP地址,因为HBase在IP地址和主机名方面似乎非常挑剔。最好使用主机名并将这些IP地址放在客户端的/etc/hosts文件中,并附上所需的主机名

答案 1 :(得分:1)

感谢@VS_FF的回答,我找到了问题,现在也发布了整个答案

此问题的简短解决方案是设置conf.setDelimiterParsingDisabled(true);

首先建议分别设置hbase.zookeeper.quorum = "ip1,ip2,ip3"(主机IP)和hbase.zookeeper.property.clientPort = 2181(端口)。

将ip地址字符串输入HBase配置。然后,它有两种解析方法,由

控制
conf = new PropertiesConfiguration();
conf.setDelimiterParsingDisabled(true);

如果应用了这个setDelimiterParsingDisabled(true),那么配置会将原始字符串输入到zookeeper,说"ip1,ip2,ip3",否则setDelimiterParsingDisabled(false)(这是默认设置),在这种情况下,它会向zookeeper输入一个数组,说[ip1,ip2,ip3]

但是,zookeeper需要获取String变量,因此如果setDelimiterParsingDisabled(false),它会首先将数组转换为String,并添加括号[]

最后,zookeeper使用符号分隔String来解析,变量,这就是为什么它最终获得ip1 = "[ip1", ip2 = "ip2", ip3 = "ip3]"并抛出NumberFormatException