通过hadoop java api访问hdfs的权限被拒绝

rn0zuynd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(424)

作为通过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中运行得很好,但是当我尝试在hdfs上通过 hadoop jar 它引发以下任一异常:

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) 怎么办?

de90aj5v

de90aj5v1#

您可以使用以下命令授予写入hdfs的权限

> hdfs dfs -chmod -R 777 /*
``` `*` 意味着将为所有文件夹启用权限 `777` 将启用所有权限(读、写和执行)
希望有帮助!!

相关问题