【问题标题】:Permission denied accessing HDFS via Hadoop java API权限被拒绝通过 Hadoop java API 访问 HDFS
【发布时间】: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


【解决方案1】:

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

> hdfs dfs -chmod -R 777 /*

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

希望对你有帮助!!

【讨论】:

  • 谢谢阿达什。它可以,但不能回答我的问题。每次运行 jar 时,我都会部署到一个新的 AWS EMR 集群,因此手动设置权限远非理想,如果它完全有效的话。最终我需要以编程方式解决这个问题。
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
相关资源
最近更新 更多