使用Hadoop的文件系统

时间:2017-07-27 09:09:37

标签: java hadoop symlink

我正在使用Hadoop的FileSystemorg.apache.hadoop.fs.FileSystem)以递归方式列出目录下的所有文件:

FileSystem.listFiles(new Path("file:/my/path"), true)

但是,我有一个递归符号链接/my/path/symlink -> /my/pathlistFiles返回一个巨大的路径列表,如

/my/path/symlink
/my/path/symlink/symlink
/my/path/symlink/symlink/symlink
/my/path/symlink/symlink/symlink/symlink
/my/path/symlink/symlink/symlink/symlink/symlink
...

是否有标志或配置参数来阻止这种情况?

我需要使用FileSystem因为我同时使用hdfs:/file:/路径。

1 个答案:

答案 0 :(得分:1)

一旦我需要在路径下递归列出目录,我就会根据FileSystem.java中listFiles的代码编写自己的listDirectories函数。

如果查看代码,它非常简单,只要你是一个符号链接就应该避免在FileStatus上重复出现。但需要注意的是,你不会得到包含父符号链接的路径。

你应该改变这个功能:

private void handleFileStat(LocatedFileStatus stat) throws IOException {
    if (stat.isFile()) { // file
      curFile = stat;
    } else if (recursive) { // directory
      itors.push(curItor);
      curItor = listLocatedStatus(stat.getPath());
    }
  }

类似于:

private void handleFileStat(LocatedFileStatus stat) throws IOException {
    if (stat.isFile()) { // file
      curFile = stat;
    } else if (recursive && !stat.isSymlink()) { // directory and not symlink
      itors.push(curItor);
      curItor = listLocatedStatus(stat.getPath());
    }
  }