【问题标题】:java.lang.NumberFormatException when trying to connect to HBase尝试连接到 HBase 时出现 java.lang.NumberFormatException
【发布时间】:2023-03-17 08:20:02
【问题描述】:

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

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

如何解决?

【问题讨论】:

  • 也许问题是显而易见的,但以防万一问题是端口号有右括号,因此它不能转换为数字。如果它是配置文件的一部分,请尝试在括号前留一个空格。
  • @Juan 变量没有任何括号,并且在控制台日志输出中它有connectString=[*,*,*],这意味着这两个括号是解析器添加的?第一个括号[没有错误,但第二个括号]有错误
  • @Juan 我还需要补充一点,如果我设置ZOOKEPER_QORUM_NODE = "172.31.17.251,172.31.17.252,172.31.17.253";,变量将变为connectString=[172.31.17.251:2181, 172.31.17.252:2181, 172.31.17.253]:2181
  • 请附上您的代码。基础For input string: "2181]",我猜你用: 溢出了你的字符串数组。您需要将数组转换为列表,然后一一溢出。
  • @Bejond 我的代码就是上面那行,ZOOKEPER_QORUM_NODE = "172.31.17.251:2181,172.31.17.252:2181,172.31.17.253:2181";这是zookeeper quorum String,我猜为什么要转换成列表是因为这个ZOOKEPER_QORUM_NODEString被解析了官方org.apache.hbase

标签: java hbase apache-zookeeper


【解决方案1】:

一些建议您尝试解决此问题:

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

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

【讨论】:

  • 感谢您的建议。我看了一下HBase的配置文档,hbase.zookeeper.property.clientPort默认是2181。正如我上面的评论,如果我只设置ZOOKEPER_QORUM_NODE = "172.31.17.251,172.31.17.252,172.31.17.253";,它将变成connectString=[172.31.17.251:2181, 172.31.17.252:2181, 172.31.17.253]:2181,错误是java.net.UnknownHostException: [172.31.17.251: invalid IPv6 address
  • 正如你所说,我已经分别设置了这两个参数,我想这就是你的意思吗?
  • 嗯,是的,我的意思是提供没有端口号的主机名,只需通过 hbase.zookeeper.property.clientPort 属性单独设置端口号(或者实际上尝试根本不设置它,因为您使用的是默认值)。
  • 你有什么理由使用 HBaseGraphConfiguration() 来设置这些属性,而不是通常的 HBaseConfiguration ?
  • 我会检查我是否可以使用HBaseConfiguration,在此之前我发现了另一个问题,请参阅java.net.UnknownHostException: [172.31.17.251: invalid IPv6 address,为什么这个括号包含在IP地址中......最后它确实导致了错误?
【解决方案2】:

感谢@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

【讨论】:

  • 这些建议的更改将在哪个文件中进行?
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2019-05-26
  • 2017-10-27
  • 1970-01-01
  • 2014-08-01
  • 2015-05-28
  • 1970-01-01
相关资源
最近更新 更多