通常,如果没有通过前导斜杠,您传递的路径要么是相对于用户 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");