使用Java递归设置Hadoop文件系统目录的权限

4

你好,我有一个测试程序,将文件加载到HDFS的路径为user/user1/data/app/type/file.gz。现在这个测试程序被多个用户多次运行。因此,我想设置文件权限为rwx,以便任何人都可以删除这个文件。我有以下代码:

fs.setPermission(new Path("user/user1/data"),new FsPermission(FsAction.ALL,FsAction.ALL,FsAction.ALL)) 

上面这一行将所有目录的权限设置为drwxrwxrwx,但对于文件.gz,它的权限是-rw-r--r--,为什么呢?因为另一个用户不能通过测试程序删除该文件。我能够通过测试程序删除该文件,因为我具有完全权限。
请指导一下。我是Hadoop的新手。提前致谢。
3个回答

8
使用FsShell APIs解决了我的目录权限问题。可能并不是最优的方式,但既然我是在为测试代码解决问题,应该就可以了。
      FsShell shell=new FsShell(conf);
      try {
        shell.run(new String[]{"-chmod","-R","777","user/usr1/data"});
      }
     catch (  Exception e) {
        LOG.error("Couldnt change the file permissions ",e);
        throw new IOException(e);
      }

1

我认为在你使用的版本中,Hadoop没有提供Java API以递归方式授予权限。实际上,这段代码只是给目录user/user1/data授权,没有做其他事情。你最好使用FileSystem.listStatus(Path f)方法列出目录下的所有文件,并对它们进行单独的权限设置。在我的2.0.5-alpha-gphd-2.1.0.0集群上可以正常工作。

然而,从Hadoop 2.2.0开始提供了一个新的构造函数:

FsPermission(FsAction u, FsAction g, FsAction o, boolean sb)

其中布尔字段可能是你想要的递归标志。但是文档(包括参数名称)太差了,无法推断出具体的内容。

请看为什么“hadoop fs -mkdir”会因权限被拒绝而失败?,尽管您的情况可能不同。(在我的情况下,dfs.permissions.enabled仍为true)。

4
参考资料,sb参数设置了粘着位,它并不是一个递归标志。 - Brian Schrameck

0

我是用Scala写的,但我认为你可以轻松地进行适应:

def changeUserGroup(user:String,fs:FileSystem, path: Path): Boolean ={
  val changedPermission = new FsPermission(FsAction.ALL,FsAction.ALL,FsAction.ALL, true)
  val fileList = fs.listFiles(path, true)
  while (fileList.hasNext()) {
    fs.setPermission(fileList.next().getPath(),changedPermission)
  }
    return true
  }

你还需要添加一个错误处理逻辑,我总是返回true。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接