【问题标题】:Unable to connect to HDFS data node from remote client无法从远程客户端连接到 HDFS 数据节点
【发布时间】:2018-04-02 14:47:56
【问题描述】:

我目前正在试验使用 Hadoop 2.3.0 构建的遗留应用程序(我知道……别问了)。只要我在与单节点 hadoop 部署相同的机器上运行客户端,一切都运行良好。现在我将客户端应用程序转移到本地网络上的另一台机器上,我无法连接到数据节点。

2018-04-02 14:33:29.661/IST WARN  [hadoop.hdfs.BlockReaderFactory] I/O error constructing remote block reader.
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:529)
at org.apache.hadoop.hdfs.DFSClient.newConnectedPeer(DFSClient.java:3044)
at org.apache.hadoop.hdfs.BlockReaderFactory.nextTcpPeer(BlockReaderFactory.java:744)
at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:659)
at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:327)
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:574)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:797)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:844)
at java.io.DataInputStream.read(DataInputStream.java:149)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at java.io.PushbackInputStream.read(PushbackInputStream.java:186)
at java.util.zip.ZipInputStream.readFully(ZipInputStream.java:403)
at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:278)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122)
at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:220)
at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:181)
at opennlp.tools.tokenize.TokenizerModel.<init>(TokenizerModel.java:125)

还有……

2018-04-02 14:33:29.666/IST WARN  [hadoop.hdfs.DFSClient] Failed to connect to localhost/127.0.0.1:50010 for block, add to deadNodes and continue. java.net.ConnectException: Connection refused
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:529)
at org.apache.hadoop.hdfs.DFSClient.newConnectedPeer(DFSClient.java:3044)
at org.apache.hadoop.hdfs.BlockReaderFactory.nextTcpPeer(BlockReaderFactory.java:744)
at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:659)
at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:327)
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:574)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:797)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:844)
at java.io.DataInputStream.read(DataInputStream.java:149)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at java.io.PushbackInputStream.read(PushbackInputStream.java:186)
at java.util.zip.ZipInputStream.readFully(ZipInputStream.java:403)
at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:278)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122)
at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:220)
at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:181)
at opennlp.tools.tokenize.TokenizerModel.<init>(TokenizerModel.java:125)

现在我可以从客户端的 Web 浏览器监控 hadoop 部署,并且那里的一切似乎都运行良好。

我已经阅读了herehere 的答案,但我仍然遇到同样的错误。我无法让客户端停止查找 localhost/127.0.0.1:50010 而不是数据节点的正确 IP 地址(或主机名)。

我的第一个问题是我是否缺少一些要在客户端应用程序上完成的配置。我的应用程序使用一个名为HADOOP_URL 的变量连接到数据库,并且它的值被正确设置为集群的主机名,进而解析为/etc/hosts 中的远程IP。可能是我缺少在客户端设置的更多配置。在这里有一些想法会很高兴。

然而,this answer 建议 Namenode 通知客户端 Datanode 的主机名。这支持我的客户端能够连接到 Namenode 的可能性,因此,客户端配置工作正常。

所以最后,我需要找到一种方法让 Namenode 返回我设置的 主机名,而不是返回 localhost/127.0.0.1。 我该如何解决这个问题?

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    所以最后,我需要找到一种方法让 Namenode 返回我设置的主机名,而不是返回 localhost/127.0.0.1。我该如何解决这个问题?

    => 根据this article,也许here 是您需要的配置

    默认情况下,HDFS 客户端使用 NameNode 提供的 IP 地址连接到 DataNode。根据网络配置,客户端可能无法访问此 IP 地址。修复是让客户端对 DataNode 主机名执行自己的 DNS 解析。以下设置启用此行为。

    <property>
      <name>dfs.client.use.datanode.hostname</name>
      <value>true</value>
      <description>Whether clients should use datanode hostnames when
        connecting to datanodes.
      </description>
    </property>
    

    【讨论】:

      【解决方案2】:
      • 读取 HDFS 文件位置的 IP 并将此 IP 添加到主机的 /etc/hosts 中(spark 所在的位置)

      注意:如果您使用的是虚拟机 - 将您的虚拟机设置更改为 Host 并重新启动机器

      • 只是为了确保,确保两台机器之间设置的连接是无密码 ssh。这里有一篇好文章:SSH passwordless

      • 使用 spark 命令时,请确保使用 user@HDFS-hostname

      示例: lines=sc.textFile("hdfs://jack@192.xxx.xx.1xx:8020/user/jack/ulysses10.txt")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多