为什么hadoopftpfilesystem.liststatus(path)不工作?

jslywgbw  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(449)

我想把文件从ftp服务器传输到hdfs。我尝试了这个方法:ftp到hdfs,演示代码如下:

Configuration conf = new Configuration();
FTPFileSystem ftpfs = new FTPFileSystem();
ftpfs.setConf(conf);
ftpfs.initialize(new URI(ftpConnectStr), conf);

Path homeDirectory = ftpfs.getHomeDirectory();
System.out.println(homeDirectory.toString());

FileStatus[] fileStatuses = ftpfs.listStatus(new Path("/"));
for(FileStatus fileStatus : fileStatuses){
    System.out.println(fileStatuses.length);
    System.out.println(fileStatus.toString());
}

boolean test = ftpfs.mkdirs(new Path("test"));
System.out.println(test);

这个 ftpfs.listStatus(new Path("/")) 不工作,它什么也不显示,但是ftp服务器有两个目录和 ftpfs.mkdirs(new Path("test")) 工作正常,程序运行结果如下:

以及ftp服务器目录,如下所示:

我在谷歌上搜索了一下,但找到了一些信息。我不知道为什么。如果你能帮助我,我将非常感激,谢谢

vxbzzdmp

vxbzzdmp1#

正如您所发现的,问题是因为hadoop(或者更确切地说是底层的apache公共网) FtpClient )默认为ftp主动模式,由于无处不在的nat和防火墙,现在很难工作。
从hadoop2.9开始,您可以通过设置 fs.ftp.data.connection.mode 启用ftp被动模式的配置选项:

fs.ftp.data.connection.mode=PASSIVE_LOCAL_DATA_CONNECTION_MODE

看到了吗https://issues.apache.org/jira/browse/hadoop-13953

xdnvmnnf

xdnvmnnf2#

最后,我找到了问题所在;在ftp服务器中,数据传输模式设置为被动。

然后我调试了ftpfilesystem的源代码,发现它没有设置ftp被动模式;

因此,我将ftpfilesystem的相关代码修改为:

重新运行程序:

而且效果很好:

相关问题