我想将文件从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服务器目录如下:
我在Google中搜索,但发现了一些信息。我不知道为什么如果您能帮助我,我将非常感谢,谢谢
最佳答案
如您所知,问题是因为Hadoop(或更确切地说是基础的Apache Common Net FtpClient
)默认为FTP Activity 模式,由于存在大量的NAT和防火墙,如今该模式几乎无法工作。
从Hadoop 2.9开始,您可以通过将 fs.ftp.data.connection.mode
configuration option设置为启用FTP被动模式来设置FTP被动模式:
fs.ftp.data.connection.mode=PASSIVE_LOCAL_DATA_CONNECTION_MODE
参见https://issues.apache.org/jira/browse/HADOOP-13953
关于java - 为什么Hadoop FTPFileSystem.listStatus(Path path)不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46745419/