HDFS Hadoop:路径.getFileSystem与文件系统.get的比较

8fq7wneg  于 2022-12-09  发布在  HDFS
关注(0)|答案(2)|浏览(232)

我正在编写一个Java类来创建一个HDFS目录,但我想在创建目录之前检查该目录是否存在。我不确定是使用Path.getFileSystem()还是FileSystem.get():

Configuration conf = new Configuration();
Path path = new Path(args[1]);
FileSystem fs = path.getFileSystem(conf);
if(fs.exists(path)) {
  System.err.println("Dir already exists");
  }
boolean status = fs.mkdirs(path);

或者我应该使用FileSystem.get()方法:

Configuration conf = new Configuration();
Path path = new Path(args[1]);
FileSystem fs = FileSystem.get(conf);
boolean status = fs.mkdirs(path);
if(!status) {
  System.err.println("Dir already exists");
  }

何时适合使用以下任一项:是文件系统路径.getFileSystem()还是文件系统.get()?

hfsqlsce

hfsqlsce1#

这取决于您是否已经有一个非空的Path对象。
空值安全的方法是将Configuration对象与静态方法FileSystem.get(conf)一起使用

cxfofazt

cxfofazt2#

如果您有多个名称空间,则建议使用path.getFileSystem(conf);

FileSystem.get(conf)将始终返回默认值文件系统
**path.getFileSystem(conf)**将返回与指定路径相关的文件系统,

如果它是完整路径(例如hdfs://haservice 2/dir 1),并且默认命名空间是hdfs://haservice 1****FileSystem。get(conf)会将FS返回到hdfs://haservice 1path。getFileSystem(conf)会将FS wrt路径返回到hdfs://haservice 2/,因此对该路径的FS调用将成功,如果我们使用来自FileSystem.get(conf)的FS,则不会出现这种情况。
如果路径不包含方案和权限(例如,只有/dir),则路径.getFileSystem(conf)和FileSystem.get(conf)的行为相同。它们都将返回由
Fs.defaultFs
config指定的默认文件系统。
在代码方面,path.getFileSystem(conf)也只使用解析的URI调用FileSystem.get(..)。

* Return the FileSystem that owns this Path.
   *
   * @param conf the configuration to use when resolving the FileSystem
   * @return the FileSystem that owns this Path
   * @throws java.io.IOException thrown if there's an issue resolving the
   * FileSystem
   */
  public FileSystem getFileSystem(Configuration conf) throws IOException {
    return FileSystem.get(this.toUri(), conf);
  }

相关问题