使用API对HDFS上的文件或文件夹权限操作
package com.hondali.permission;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.fs.permission.FsPermission;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* 用于文件/目录权限的类。
*/
public class HDFSPermission {
/**
* 设置hdfs文件/文件夹权限
*
* @param conf 配置
* @param host ip 或 hostname
* @param port 端口
* @param path 文件/文件夹路径
* @param permission 权限
*/
public void setPermission(Configuration conf, String host, String port, String path, String permission){
String hdfsPath = "hdfs://" + host + ":" + port;
try(FileSystem fs = FileSystem.get(new URI(hdfsPath), conf)) {
FsPermission fsPermission = HDFSPermission.fileSystemAction(permission);
fs.setPermission(new Path(path), fsPermission);
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
}
}
/**
* 设置hdfs文件/文件夹权限
*
* @param conf 配置
* @param host ip 或 hostname
* @param port 端口
* @param path 文件/文件夹路径
* @param u 用户操作权限
* @param g 组操作权限
* @param o 其他操作权限
*/
public void setPermission(Configuration conf, String host, String port, String path, FsAction u, FsAction g, FsAction o) {
String hdfsPath = "hdfs://" + host + ":" + port;
try (FileSystem fs= FileSystem.get(new URI(hdfsPath), conf)) {
FsPermission fsPermission = new FsPermission(u, g, o);
fs.setPermission(new Path(path), fsPermission);
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
}
}
/**
* 为文件系统添加执行权限
*
* @param permission 权限
* @return 文件/目录权限
*/
private static FsPermission fileSystemAction(String permission) {
FsPermission fsPermission = null;
switch (permission){
// 文件相当于:----------
// 目录相当于:d---------
case "000":
fsPermission = new FsPermission(FsAction.NONE, FsAction.NONE, FsAction.NONE);
break;
// 文件相当于:---x--x--x
// 目录相当于:d--x--x--x
case "111":
fsPermission = new FsPermission(FsAction.EXECUTE, FsAction.EXECUTE, FsAction.EXECUTE);
break;
// 文件相当于:--w--w--w-
// 目录相当于:d-w--w--w-
case "222":
fsPermission = new FsPermission(FsAction.WRITE, FsAction.WRITE, FsAction.WRITE);
break;
// 文件相当于:--wx-wx-wx
// 目录相当于:d-wx-wx-wx
case "333":
fsPermission = new FsPermission(FsAction.WRITE_EXECUTE, FsAction.WRITE_EXECUTE, FsAction.WRITE_EXECUTE);
break;
// 文件相当于:-r--r--r--
// 目录相当于:dr--r--r--
case "444":
fsPermission = new FsPermission(FsAction.READ, FsAction.READ, FsAction.READ);
break;
// 文件相当于:-r-xr-xr-x
// 目录相当于:dr-xr-xr-x
case "555":
fsPermission = new FsPermission(FsAction.READ_EXECUTE, FsAction.READ_EXECUTE, FsAction.READ_EXECUTE);
break;
// 文件相当于:-rw-rw-rw-
// 目录相当于:drw-rw-rw-
case "666":
fsPermission = new FsPermission(FsAction.READ_WRITE, FsAction.READ_WRITE, FsAction.READ_WRITE);
break;
// 文件相当于:-rwxrwxrwx
// 目录相当于:drwxrwxrwx
case "777":
fsPermission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.ALL);
break;
}
return fsPermission != null ? fsPermission : new FsPermission(FsAction.ALL, FsAction.READ_EXECUTE, FsAction.READ_EXECUTE);
}
}
上面代码中出现了类似下面这段代码的语句,该语句确保了每个资源,在语句结束时关闭。资源指的是使用完后,需要关闭的对象,比如说文章里使用的FileSystem对象,又或者是inputstream和outputstream对象。
try(语句1;语句2) {
// 语句
} catch (IOException e) {
e.printStackTrace();
}
使用junit测试上面的代码
package com.hondali.permission.test;
import com.hondali.permission.HDFSPermission;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.permission.FsAction;
import org.junit.Before;
import org.junit.Test;
public class HDFSPermissionTest {
HDFSPermission permission = null;
Configuration conf = null;
@Before
public void init() {
System.setProperty("HADOOP_USER_NAME", "hadoop");
conf = new Configuration();
permission = new HDFSPermission();
}
@Test
public void testSetPermission(){
// permission.setPermission(conf, "hadoop51", "9000", "/user/hive/warehouse/test","333");
permission.setPermission(conf, "hadoop51", "9000", "/user/hive/warehouse/test", FsAction.ALL,FsAction.READ_EXECUTE,FsAction.READ_EXECUTE);
}
}