Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Hadoop java API访问HDFS的权限被拒绝_Java_Hadoop_Permissions_Hdfs - Fatal编程技术网

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

通过Hadoop java API访问HDFS的权限被拒绝,java,hadoop,permissions,hdfs,Java,Hadoop,Permissions,Hdfs,作为通过hadoop运行的jar的一部分,我想实现一个简单的函数,该函数(a)创建一个不存在的文件,(b)将新行中传入的字符串中的字节追加到此文件中 我写了以下内容: public class FSFacade { private static FileContext fc = FileCOntext.getFileContext(); public static void appendRawText(Path p, String data) throws IOException {

作为通过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) 是否已传入写入
路径
的所有适当权限?(我想这意味着在路径中的所有文件夹上执行perms,在最后一个文件夹上写入perms?

(b) 如果文件还不存在,确实会创建该文件,正如我所期望的那样
EnumSet.of(CREATE,APPEND)
要做什么?

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

> hdfs dfs -chmod -R 777 /*
*
表示将为所有文件夹启用权限
777
将启用所有权限(读取、写入和执行)


希望能有帮助

您可以显示根路径的权限吗?您使用了哪个用户?对于第二个问题,您需要为中间目录调用mkdirs以访问任何文件。我可以通过
bin/hdfs dfs-ls/
查看
/
内容的权限,但我不确定如何查看
/
本身的权限?我也不确定使用哪个用户,我只调用
bin/hadoop jar my-program.jar param1 param2…
。我知道mkdirs,尽管我期望
CreateOpts.createParents()
可以做到这一点?如果您没有启用Kerberos,则正在检查的用户权限由您运行命令的任何用户执行。如果您运行
whoami
,这会告诉您。我通常使用Filesystem类。我个人不知道FileContext是如何工作的谢谢adarsh。它可能会,但不能回答我的问题。每次运行jar时,我都会部署到一个新的AWS-EMR集群,因此手动设置权限远远不够理想,如果它真的有效的话。最终,我需要通过编程来解决这个问题。