我创建了一个零字节文件,其特定所有者和权限为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上的文件。
答案 0 :(得分:2)
您没有复制文件,“copyFromLocal”实际上意味着“上传”。你真的在从hdfs系统进行上传(你确定这是你想做的吗?)。
无论哪种方式,当前的hadoop客户端库都不会检查“local”是否是基于hdfs的文件系统,并且不会尝试维护权限(或者实际上对它们执行任何操作)。如果您想在使用此系统时拥有特定权限,则必须自行设置(请参阅setPermission and FsPermission)
对于您的特定用例,您可能需要查看FileUtil,并确保指定两个FileSystems(而不是两个文件)。