【问题标题】:Why Hadoop FTPFileSystem.listStatus(Path path) doesn't work?为什么 Hadoop FTPFileSystem.listStatus(Path path) 不起作用?
【发布时间】:2018-03-26 12:07:25
【问题描述】:

我想将文件从 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服务器目录如下:

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

【问题讨论】:

    标签: java hadoop ftp hdfs


    【解决方案1】:

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

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

    所以,我把FTPFileSystem的相关代码修改成这样:

    重新运行程序:

    而且效果很好:

    【讨论】:

      【解决方案2】:

      正如您所发现的,问题在于 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

      【讨论】:

        猜你喜欢
        • 2021-06-21
        • 2012-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        相关资源
        最近更新 更多