我有两个在Ubuntu上运行的码头集装箱,其中一个是hadoop namenode,另一个是hadoop datanode。无法连接到Docker主机以外的码头集装箱
现在我有我在Windows上运行的java代码使用Hadoop FileSystem api将文件从我的Windows文件系统复制到远程docker hdfs。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.io.File;
public class HadoopTest {
@Test
public void testCopyFileToHDFS() throws Exception {
Configuration configuration = new Configuration();
configuration.addResource(getClass().getClassLoader().getResourceAsStream("hadoop/core-site.xml"));
configuration.addResource(getClass().getClassLoader().getResourceAsStream("hadoop/yarn-site.xml"));
FileSystem fileSystem = FileSystem.get(configuration);
FileUtil.copy(new File("c:\\windows-version.txt"),fileSystem, new Path("/testsa"), false,configuration);
}
}
,但我得到了以下错误:
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
你可以看到第一行错误,说:“连接到数据节点172.18.0.2:50010”是一个码头工人的内部IP地址。
我的Java代码运行在Docker主机之外的真正的Windows机器上。
我已将Hadoop HDFS端口(例如9000和50010)映射到我的docker主机(ubuntu)。因此,我可以通过docker主机ip地址和HDFS端口访问HDFS名称节点。
下面是我的java代码的逻辑:
1)Java代码在Windows机器
2)Java代码使用文件系统API运行从Windows到远程复制HDFS文件。
3)客户端可以通过使用搬运工主机的IP地址和从搬运工容器(例如9000)
4)HDFS的Namenode服务器将处理该请求从客户端发送和返回数据节点的映射端口连接到HDFS名称节点IP地址到客户端。
5)客户端尝试通过使用数据节点的IP地址
6)客户拿到这表示,这些数据节点的IP地址不能访问错误从本地拷贝文件,因为它的码头工人容器内的IP地址
哪里你的Java代码是在运行吗?为什么不能将这两种服务的端口映射到主机? – Grimmy
请看看我的更新。 –
为什么不试试你指向'''192.168.1.25:50010''的java代码,你应该在你的Docker容器中启用端口。例如'''docker run -p 50010:50010''' –