Hadoop: Path.getFileSystem vs FileSystem.get



我正在编写一个Java类来创建HDFS目录,但是想在创建目录之前检查该目录是否存在。我不确定是否使用Path.getFileSystem()或filessystem .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);
或者我应该使用filessystem .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");
}

什么时候使用Path.getFileSystem()或filessystem .get()是合适的?

这取决于您是否已经有一个非空的Path对象。

null安全的方法是使用Configuration对象和静态方法FileSystem.get(conf)

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

;FileSystem.get(参看)将始终返回默认文件系统

path.getFileSystem(参看)将根据指定的路径返回文件系统

如果是全路径(例如:hdfs://haservice2 dir1),默认命名空间为hdfs://haservice1FileSystem.get(参看)将返回FShdfs://haservice1path.getFileSystem(参看)将返回FS wrt路径,即FS到hdfs://haservice2/,因此对该路径的FS调用将成功,如果我们使用filessystem .get(conf)中的FS,则不会出现这种情况

如果路径不包含方案&(如权威。对于path.getFileSystem(conf) &FileSystem.get(配置)。它们都将返回由指定的默认文件系统Fs.defaultFsconfig .

代码方面,path.getFileSystem(conf)也只调用解析过的URI的filessystem .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);
}

相关内容

  • 没有找到相关文章

最新更新