在使用命令行时我们可以使用命令
hdfs dfs -chmod 777 /文件名
来修改文件权限。但是往往在实际应用中我们不能使用命令行。这时就要使用hadoop提供的API进行权限的控制。
Hadoop权威指南也已经很清楚的提示了权限的用法(Hadoop权限管理权威指南-点击进入)
下面我就写一个小例子
public class HdfsUtils {
/*
* create by LiuWenSheng
*/
private static String HDFS_PROTOCOL = "hdfs://datacube202:9000/myproject/";
private static Configuration conf=new Configuration();
static{
conf.set("fs.defaultFS", "hdfs://datacube202:9000/");
}
/**
* 把指定的io流加载到指定的文件路径中
* @param is io流
* @param path 加载到hdfs的路径
* @return 是否加载成功
*/
public static boolean load2HDFS(InputStream is, String path){
try{
Path p = new Path(HDFS_PROTOCOL + path);
FileSystem fs = FileSystem.get(conf);
FsPermission permission = new FsPermission(FsAction.ALL,FsAction.ALL,FsAction.ALL);
FSDataOutputStream out = fs.create(p);
fs.setPermission(p,permission);
IOUtils.copyBytes(is,out,4096);
is.close();
out.close();
fs.close();
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
}
junit测试类
public class ForTest {
private Configuration conf = new Configuration();
@Before
public void beforeBegining(){
conf.set("fs.defaultFS", "hdfs://datacube202:9000/");
}
@Test
public void test_load2HDFS() throws FileNotFoundException {
boolean b = HdfsUtils.load2HDFS(new FileInputStream("D:\\test"), "张三/CLUSTERING/e/m/a.txt");
System.out.println(b);
}
}
权限控制的代码为
FsPermission permission = new FsPermission(FsAction.ALL,FsAction.ALL,FsAction.ALL);
fs.setPermission(p,permission);
此时上传的就是 777 权限,想要控制你的权限就为其他请查看Hadoop的API关于(FsPermission-点击进入)