通过Hadoop java API访问HDFS的权限被拒绝
作为通过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)
# 1 楼答案
您可以使用以下命令授予写入HDFS的权限
*
表示将为所有文件夹启用权限777
将启用所有权限(读、写和执行)希望有帮助