【问题标题】:nifi can't assign requested addressnifi 无法分配请求的地址
【发布时间】:2017-09-15 22:03:08
【问题描述】:

我正在使用 apache-nifi,似乎在启动 Web 服务器时我无法绑定到地址,除非在配置文件中我使用公共 DNS 名称。使用 DNS 名称解析到的 IP 地址不起作用。同样,使用在/etc/hosts 中分配的主机别名也不起作用。在每种情况下,我都会在 nifi 日志中看到码头抛出的异常,说它无法分配请求的地址。

端口上已经没有任何监听了,正如 netstat 所证实的那样,当我使用 DNS 名称时,没有错误绑定到地址。这是设计使然,还是我做错了什么?

这是我的配置的详细信息。 (我实际上正在运行一个 nifi 集群,并且嵌入式 zookeeper 也无法绑定 IP 地址或主机别名,但可以使用 DNS 名称。由于如果我使用单个 nifi 节点并关闭集群,则会发生故障,我仅显示 nifi 服务器配置。)

nifi 服务器在具有公共 dns 的云服务中的虚拟机上运行。假设公共 DNS 名称是“dns-abc”,它解析到地址 1.2.3.4。

如果我在 nifi.properties nifi.web.http.host=1.2.3.4 中指定,则绑定失败。如果我指定 nifi.web.http.host=dns-abc 它会成功。于是我在/etc/hosts 中创建了一个条目,如下所示:

1.2.3.4    nifi-1

我在 nifi.properties 中指定了nifi.web.http.host=nifi-1,但绑定再次失败。

编辑:这是堆栈跟踪

2017-09-18 01:02:30,610 WARN [main] org.apache.nifi.web.server.JettyServer Failed to start web server... shutting down.
java.net.BindException: Cannot assign requested address
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:298)
        at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
        at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
        at org.eclipse.jetty.server.Server.doStart(Server.java:431)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
        at org.apache.nifi.web.server.JettyServer.start(JettyServer.java:705)
        at org.apache.nifi.NiFi.<init>(NiFi.java:160)
        at org.apache.nifi.NiFi.main(NiFi.java:267)

【问题讨论】:

  • 你能提供完整的错误吗?
  • 我编辑了问题帖子并添加了堆栈跟踪。
  • 可能在你的 VM 内部 dns-abc 解析为不同的 IP?
  • 是的,就是这样。 VM 将公共 dns 名称解析为专用 IP 地址,而 VM 外部的系统将相同的 dns 名称解析为公共 IP 地址。因此,当我尝试绑定到公共 IP 或解析到它的名称时它会失败,但是当我绑定到私有 IP 时它会起作用。这是预期的吗?有没有办法绑定公网IP?
  • 你只能监听分配给你的虚拟机网络设备的地址。

标签: network-programming apache-nifi


【解决方案1】:

在云中运行的虚拟机将自己的公共 DNS 名称解析为其本地 IP 地址,而虚拟机外部的服务器将相同的名称解析为虚拟机的公共 IP 地址。由于配置必须为要绑定的服务器指定本地 IP 地址,并且集群中的其他主机将使用与远程连接所需的主机地址相同的配置节点名称,因此它仅适用于类似的 DNS 解析这个。

我在每个系统上修改了/etc/hosts,以将其自己的名称解析为其本地 IP 地址,并将集群中的其他主机解析为其公共 IP 地址。然后我可以将/etc/hosts 中的主机名用于所有 zookeeper 和 nifi 配置文件。这就是我所追求的,因为重新启动 VM 时 IP 地址会发生变化,我只需要在每个 VM 上的一个地方更改它们。

【讨论】:

    【解决方案2】:

    另一个进程可能正在使用您配置的端口。如果您使用的是默认端口,请尝试:

    netstat -na | grep LISTEN | grep 8080
    

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2012-08-12
      相关资源
      最近更新 更多