【发布时间】:2018-06-19 11:59:43
【问题描述】:
作为通过 hadoop 运行的 jar 的一部分,我想实现一个简单的函数,该函数 (a) 如果文件不存在则创建一个文件,(b) 将新行中传入的字符串中的字节追加到该文件中.
我写了以下内容:
public class FSFacade {
private static FileContext fc = FileCOntext.getFileContext();
public static void appendRawText(Path p, String data) throws IOException {
InputStream is
= new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
FsPermission permissions
= new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.ALL);
OutputStream os
= fc.create(p,
EnumSet.of(CREATE, APPEND),
CreateOpts.perms(permissions),
CreateOpts.createParents());
IOUtils.copyBytes(is, os, new Configuration());
}
}
这段代码在 Eclipse 中运行良好,但是当我尝试通过 hadoop jar 在 HDFS 上运行它时,它会引发以下任一异常:
java.io.FileNotFoundException: /out (Permission denied)
java.io.FileNotFoundException: /results/out (no such file or directory)
我假设第一个被引发是因为我的进程没有写入 HDFS 根目录的权限。第二个可能意味着如果文件尚不存在,我的代码不会以某种方式创建文件。
如何以编程方式确保我的流程
(a) 是否具有写入传入的Path 的所有适当权限? (我认为这意味着对路径中的所有文件夹执行 perms 并在最后一个文件夹上写入 perms ?)
(b) 如果文件不存在,确实会创建文件,正如我所期望的 EnumSet.of(CREATE, APPEND) 所做的那样?
【问题讨论】:
-
可以显示根路径的权限吗?你用的是哪个用户?对于第二个,您需要调用 mkdirs 来获取任何文件的中间目录
-
我可以使用
bin/hdfs dfs -ls /查看/内容的权限,但我不确定如何查看/本身的权限?我也不确定我使用的是哪个用户,我只是打电话给bin/hadoop jar my-program.jar param1 param2 ...。我知道 mkdirs,虽然我预计CreateOpts.createParents()会这样做? -
如果您没有启用 Kerberos,则检查的用户权限将由您运行命令的任何用户执行。如果你运行
whoami,就会告诉你。 -
我通常使用 Filesystem 类。我个人不知道 FileContext 是如何工作的
标签: java hadoop permissions hdfs