我有一个目录结构:
/
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");
并且代码中不需要更改?
答案 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");