对HDFS上的文件或文件夹权限操作

使用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);
    }
}

你可能感兴趣的:(大数据)