权限被拒绝通过Hadoop Java API访问HDFS

时间:2018-06-19 11:59:43

标签: java hadoop permissions hdfs

作为jar的一部分通过hadoop运行,我想实现一个简单的函数,该函数(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的所有适当权限? (我认为这意味着在路径中的所有文件夹上执行权限,并在最后一个文件夹上写权限?)
(b)确实创建了文件(如果尚不存在),正如我期望EnumSet.of(CREATE, APPEND)所做的那样?

1 个答案:

答案 0 :(得分:0)

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

> hdfs dfs -chmod -R 777 /*

*表示将为所有文件夹启用权限 777将启用所有权限(读取,写入和执行)

希望有帮助!