我想把文件从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服务器目录,如下所示:
我在谷歌上搜索了一下,但找到了一些信息。我不知道为什么。如果你能帮助我,我将非常感激,谢谢
2条答案
按热度按时间vxbzzdmp1#
正如您所发现的,问题是因为hadoop(或者更确切地说是底层的apache公共网)
FtpClient
)默认为ftp主动模式,由于无处不在的nat和防火墙,现在很难工作。从hadoop2.9开始,您可以通过设置
fs.ftp.data.connection.mode
启用ftp被动模式的配置选项:看到了吗https://issues.apache.org/jira/browse/hadoop-13953
xdnvmnnf2#
最后,我找到了问题所在;在ftp服务器中,数据传输模式设置为被动。
然后我调试了ftpfilesystem的源代码,发现它没有设置ftp被动模式;
因此,我将ftpfilesystem的相关代码修改为:
重新运行程序:
而且效果很好: