在Configuration中设置HDFS的根目录

时间:2012-12-12 12:37:15

标签: java database hadoop hdfs

我有一个目录结构:

/  
   DIR files
   DIR usr

我的HDFS在hdfs://db:123处可用,因此我创建了配置:

configuration.set("fs.default.name", "hdfs://db:123");

然后所有目录/路径都相对于根(/)。我创建了一个目录files,这是我想保留所有文件的地方。

我是否必须手动将/files/附加到代码中每个路径的开头,或者我是否可以创建配置:

configuration.set("fs.default.name", "hdfs://db:123/files");

并且代码中不需要更改?

1 个答案:

答案 0 :(得分:2)

通常,如果没有传递前导斜杠,则传递的路径相对于用户HDFS主目录,如果没有前缀,则为绝对路径。

如果您查看Path.makeQualified的源代码,您应该看到路径不是绝对的测试(这是1.0.3):

/** Returns a qualified path object. */
public Path makeQualified(FileSystem fs) {
  Path path = this;
  if (!isAbsolute()) {
    path = new Path(fs.getWorkingDirectory(), this);
  }

DistributedFileSystem.getWorkingDirectory()在响应中使用名为workingDir的实例变量,可以使用setWorkingDirectory(path)方法设置。如果您没有自己设置工作目录,则默认为用户的主目录(可以在DistributedFileSystem.initialize(..)方法中看到:

this.workingDir = getHomeDirectory();

DistributedFileSystem.getHomeDirectory()

public Path getHomeDirectory() {
  return new Path("/user/" + dfs.ugi.getShortUserName()).makeQualified(this);
}

您似乎无法通过配置属性配置工作目录,因此您必须在提交作业之前调用以下内容(之后所有相对路径将相对于/ files):

FileSystem.get(configuration).setWorkingDirectory("/files");