hadoop远程复制

hrysbysz  于 2021-05-30  发布在  Hadoop
关注(0)|答案(0)|浏览(254)

我需要将一些文件从hdfs:///user/hdfs/path1复制到hdfs:///user/hdfs/path2。我写了一个java代码job:-

ugi = UserGroupInformation.createRemoteUser("hdfs", AuthMethod.SIMPLE);
System.out.println(ugi.getUserName());
conf = new org.apache.hadoop.conf.Configuration();
// TODO: Change IP
conf.set("fs.defaultFS", URL);
conf.set("hadoop.job.ugi", user);
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
// paths = new ArrayList<>();
  fs = FileSystem.get(conf);

我得到了外卡的所有路径

fs.globStatus(new Path(regPath));

复制为

FileUtil.copy(fs, p, fs, new Path(to + "/" + p.getName()), false, true, conf);

但是,复制失败,并显示以下消息,而globstatus执行成功

WARN  BlockReaderFactory:682 - I/O error constructing remote block reader.
org.apache.hadoop.net.ConnectTimeoutException: 60000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/10.110.80.177:50010]
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:532)
    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:100)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:78)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:52)
    at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:112)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:366)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:338)

请注意,我使用端口转发在internet上远程运行代码。即
192.168.1.10[java api]--->154.23.56.116:8082[名称节点公共i/p]=======10.1.3.4:8082[名称节点专用ip]
我想下面是reason:-
向namenode查询由name节点成功执行的globstatus
复制命令被传递到namenode,namenode将返回10.110.80.177:50010,用于其他计算机上的其他数据节点地址,然后javaip将尝试将复制命令传递到这些数据节点,因为它们没有导出到外部世界我得到了这个错误!
我的推断正确吗?如何解决这个问题?我是否需要在namenode创建一个java服务器,它将收集copy命令并在集群中本地复制文件。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题