Hadoop 无法连接到docker主机外部的docker容器

Hadoop 无法连接到docker主机外部的docker容器,hadoop,docker,Hadoop,Docker,我在ubuntu上运行了两个docker容器,其中一个用于hadoop namenode,另一个用于hadoop datanode 现在我的java代码运行在windows上,使用Hadoop文件系统api将文件从windows文件系统复制到远程docker hdfs。 但我得到了以下错误: 16:57:05.669 [Thread-4] DEBUG org.apache.hadoop.hdfs.DFSClient - Connecting to datanode 172.18.0.2:500

我在ubuntu上运行了两个docker容器,其中一个用于hadoop namenode,另一个用于hadoop datanode

现在我的java代码运行在windows上,使用Hadoop文件系统api将文件从windows文件系统复制到远程docker hdfs。

但我得到了以下错误:

16:57:05.669 [Thread-4] DEBUG org.apache.hadoop.hdfs.DFSClient - Connecting to datanode 172.18.0.2:50010
16:57:15.654 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: closed
16:57:15.655 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: stopped, remaining connections 0
16:57:26.670 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Exception in createBlockOutputStream
java.net.ConnectException: Connection timed out: no further information
    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:531)
    at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1533)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1309)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1262)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448)
16:57:26.673 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Abandoning BP-53577818-172.18.0.2-1500882061263:blk_1073741827_1003
您可以看到第一行错误,即“连接到datanode 172.18.0.2:50010”是docker内部ip地址

我的Java代码运行在docker主机之外的真实windows机器上

我已经将Hadoop HDFS端口(例如9000和50010)映射到我的docker主机(ubuntu)。因此,我可以通过docker主机ip地址和HDFS的端口访问HDFS名称节点

下面是我的java代码的逻辑:

1) Java代码正在windows计算机上运行

2) Java代码使用文件系统api将文件从windows复制到远程HDF

3) 客户端可以使用docker主机的Ip地址和docker容器映射的端口(如9000)连接到HDFS名称节点

4) HDFS Namenode服务器将处理从客户端发送的请求,并将数据节点的ip地址返回给客户端

5) 客户端尝试使用数据节点的ip地址从本地复制文件

6) 客户端收到错误,该错误表示无法访问数据节点的ip地址,因为它是docker容器中的ip地址


最后,我通过为datanode引入主机名找到了解决方案,并允许hdfs客户端在连接到datanode时使用主机名而不是ip地址,我的客户端还需要将datanode主机名映射为docker主机ip地址,以下是详细步骤:

  • 在docker-compose.xml中添加docker datanode容器的主机名

    主机名:datanode.company.com

  • 允许hdfs(服务器和客户端)使用主机名而不是ip地址

  • 
    dfs.client.use.datanode.hostname
    真的
    dfs.datanode.use.datanode.hostname
    真的
    
    那么您的Java代码在哪里运行?为什么您不能将这两个服务的端口映射到主机?请查看我的更新。为什么不尝试使用指向
    192.168.1.25:50010的java代码,您应该在docker容器中启用端口。例如,
    docker run-p50010:50010
    不是hadoop专家。但是您可以将
    NameNode
    配置为将
    192.168.1.25:50010
    返回为
    DataNode
    访问ip地址吗?或者在
    NameNode
    DataNode
    之前,是否有一个工具可以充当代理,提供HTTP API服务器,而不是以这种方式重新指定?不,我不能直接指向192.168.1.25:50010,因为172.18.0.2:50010是按名称节点docker容器返回的。谢谢。这确实帮了我的忙。你能告诉我如何使用这个docker-compose.xml文件连接到hdfs吗?你能帮我连接到容器外docker中运行的hdfs吗?
    16:57:05.669 [Thread-4] DEBUG org.apache.hadoop.hdfs.DFSClient - Connecting to datanode 172.18.0.2:50010
    16:57:15.654 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: closed
    16:57:15.655 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: stopped, remaining connections 0
    16:57:26.670 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Exception in createBlockOutputStream
    java.net.ConnectException: Connection timed out: no further information
        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:531)
        at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1533)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1309)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1262)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448)
    16:57:26.673 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Abandoning BP-53577818-172.18.0.2-1500882061263:blk_1073741827_1003