如何复制到HDFS文件仍然保留权限?

时间:2014-04-02 02:58:34

标签: hadoop hdfs

我创建了一个零字节文件,其特定所有者和权限为600

-rw-------   3 cloudera hdfs         56 2014-04-01 18:47 Data/input/test.dat
cloudera:/home/cloudera

当我尝试通过api运行副本时,我发现它将权限从600转到644.我如何保留权限?任何帮助将不胜感激。

复制前

***>hadoop fs -ls Data/input/
Found 1 items
-rw-------   3 cloudera cloudera         10 2014-04-01 19:54 Data/input/test.dat

复制后

***>hadoop fs -ls Data/input/
Found 1 items
-rw-r--r--   3 cloudera cloudera         10 2014-04-01 19:55 Data/input/test.dat

我运行的脚本

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class FilePerm{
    public static void main(String[] args) throws IOException{
        Path src = new Path("/home/cloudera/input1.dat");
        Path tgt = new Path("Data/input/test.dat");

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        System.out.println(fs.getConf().get("dfs.support.append"));
        fs.copyFromLocalFile(src, tgt);
        System.out.println("Completed copy");
    }
}

要添加,src是本地UNIX文件系统上的文件,而tgt是HDFS上的文件。

1 个答案:

答案 0 :(得分:2)

您没有复制文件,“copyFromLocal”实际上意味着“上传”。你真的在从hdfs系统进行上传(你确定这是你想做的吗?)。

无论哪种方式,当前的hadoop客户端库都不会检查“local”是否是基于hdfs的文件系统,并且不会尝试维护权限(或者实际上对它们执行任何操作)。如果您想在使用此系统时拥有特定权限,则必须自行设置(请参阅setPermission and FsPermission

对于您的特定用例,您可能需要查看FileUtil,并确保指定两个FileSystems(而不是两个文件)。