Hadoop使用Java以递归方式将fsPermission设置为dir

时间:2014-10-17 13:34:42

标签: java hadoop hdfs

您好我有测试程序,它将文件加载到此路径的{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所有dirs但是对于file.gz,它给出了-rw-r--r--的权限为什么呢?由于这个原因,除了我之外的另一个用户无法通过测试程序删除此文件。我可以通过测试程序删除文件,因为我有充分的感情。

请指导。我是Hadoop的新手。提前谢谢。

3 个答案:

答案 0 :(得分:8)

使用FsShell API解决了我的dir权限问题。它可能不是最佳方式,但因为我正在为测试代码解决它应该没问题。

      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 :(得分:1)

我认为Hadoop没有提供java API来在你正在使用的版本中递归地提供权限。代码实际上是对dir user/user1/data授予权限,而不是其他任何内容。您最好使用FileSystem.listStatus(Path f)方法列出目录中的所有文件,并单独使用Filsystem.setPermission。它目前在我的2.0.5-alpha-gphd-2.1.0.0集群上工作。

但是从Hadoop 2.2.0开始,新的构造函数

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

正在提供

。布尔字段可能是您想要的递归标志。但是文档(包括param名称)太差,无法推断具体的东西。

同时查看Why does "hadoop fs -mkdir" fail with Permission Denied?,尽管您的情况可能有所不同。 (在我的情况下dfs.permissions.enabled仍然是真的。)

答案 2 :(得分: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。