我想将文件从ftp服务器传输到hdfs。我试过这个方法:FTP TO 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服务器dirctory如下:
我在谷歌搜索,但找到一些信息。我不知道为什么。如果你能帮助我,我将非常感激,谢谢
答案 0 :(得分:0)
最后,我发现问题所在;在FTP服务器中,数据转移模式设置为被动。
然后我发现了FTPFileSystem的源代码,我发现它没有设置FTP被动模式;
所以,我将FTPFileSystem的相关代码修改为:
重新运行程序:
并且工作正常:
答案 1 :(得分:0)
您已经发现,问题是因为Hadoop(或更确切地说是底层的Apache Common Net FtpClient
)默认为FTP活动模式,由于存在大量的NAT和防火墙,如今该模式几乎无法工作。
从Hadoop 2.9开始,您可以通过设置fs.ftp.data.connection.mode
configuration option来启用FTP被动模式来设置FTP被动模式:
fs.ftp.data.connection.mode=PASSIVE_LOCAL_DATA_CONNECTION_MODE