1

我有一个目录结构:

/  
   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");

并且不需要更改代码?

4

1 回答 1

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");
于 2012-12-13T02:30:54.663 回答