为什么Hadoop FTPFileSystem.listStatus(路径路径)不起作用?

时间:2017-10-14 14:03:21

标签: hadoop ftp hdfs

我想将文件从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"))工作正常,程序运行结果如下:

enter image description here

和ftp服务器dirctory如下:

enter image description here

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

2 个答案:

答案 0 :(得分:0)

最后,我发现问题所在;在FTP服务器中,数据转移模式设置为被动。

enter image description here

然后我发现了FTPFileSystem的源代码,我发现它没有设置FTP被动模式;

enter image description here

所以,我将FTPFileSystem的相关代码修改为:

enter image description here

重新运行程序:

enter image description here

并且工作正常:

enter image description here

答案 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

请参见https://issues.apache.org/jira/browse/HADOOP-13953