@xtccc
2015-12-03T21:23:15.000000Z
字数 3012
阅读 4233
HDFS
参考
假设,HDFS中有一个目录,如下:
[root@hadoop1 ~]# hdfs dfs -ls /user/tao
Found 3 items
drwxrwxr-x+ - hdfs supergroup 0 2015-09-09 10:29 /user/tao/data
drwxr-xr-x - hdfs supergroup 0 2015-11-18 14:09 /user/tao/guizhou
drwxr-xr-x - hdfs supergroup 0 2015-12-03 20:23 /user/tao/test
[root@hadoop1 ~]# hdfs dfs -ls /user/tao/test
Found 1 items
-rw-r--r-- 3 hdfs supergroup 485128 2015-12-03 20:23 /user/tao/test/log.txt
文件 /user/tao/test/log.txt 的owner是hdfs
,所属的group为supergroup
,我希望用以tao
这个用户来删除该文件。
[root@hadoop1 ~]# sudo -u tao hdfs dfs -rm /user/tao/test/log.txt
15/12/03 20:33:08 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
15/12/03 20:33:08 WARN fs.TrashPolicyDefault: Can't create trash directory: hdfs://hadoop5.com:8020/user/tao/.Trash/Current/user/tao/test
rm: Failed to move to trash: hdfs://hadoop5.com:8020/user/tao/test/log.txt: Permission denied: user=tao, access=WRITE, inode="/user/tao":hdfs:supergroup:drwxrwxr-x:user:hbase:rwx,group::r-x
权限不够!
解决方法1: 赋予用户tao删除该文件的权限
解决方法2: 将用户tao加入群组supergroup,然后向群组supergroup赋予删除该文件的权限。
解决方法3: 通过ACL来赋予用户tao对该文件的删除权限
首先用命令id -Gn {username}
来查看用户tao属于哪一个group。
[root@hadoop1 ~]# id -Gn tao
tao
这是Linux Shell中对用户群组的判断,与HDFS对用户群组的判断并不相同。
HDFS怎么判断tao属于哪一个group呢?
当一个用户执行某个hadoop命令时,Namenode或者JobTracker会知道执行该命令的用户的username:这个username就是执行该命令的用户在其所在的linux上的用户名。
同时,Namonode或者JobTracker还会判断该user属于哪个group —— 这是通过一系列的plugin (group mapping service)来实现的:
- org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback
- org.apache.hadoop.security.ShellBasedUnixGroupsMappingWithFallback(默认)
- org.apache.hadoop.security.LdapGroupsMapping
这些可以在Cloudera Manager中进行配置,如下:
如果使用org.apache.hadoop.security.ShellBasedUnixGroupsMappingWithFallback
这个插件,那么HDFS会以如下的方式判断一个user所属的group:
如果Namenode所在节点的Linux中存在用户tao,且这个用户在Linux中属于群组supergroup,那么HDFS就认为用户tao属于群组supergroup
当我们从其他节点上操作HDFS时,如果以tao的身份进行操作,即使该节点上没有群组supergroup,或者该节点上的用户user不属于群组supergroup,HDFS也会认为操作者(tao)属于群组supergroup,因为HDFS只根据Namenode节点判断tao与supergroup的关系。
Hadoop中的ACL与Linux中的ACL机制基本相同,都是用于为文件系统提供更精细化的权限控制。
getfacl用于查看一个文件/目录的ACL状态,例如:
[root@hadoop1 ~]# hdfs dfs -getfacl /user/tao/test/log.txt
# file: /user/tao/test/log.txt
# owner: hdfs
# group: supergroup
user::rw-
group::r--
other::r--
在HDFS文件原生的权限之外,针对某个文件,为某个指定的user再设置权限,可以通过setfacl来完成。
[root@hadoop1 ~]# sudo -u hdfs hdfs dfs -setfacl -m user:tao:rwx /user/tao/test/log.txt
[root@hadoop1 ~]# hdfs dfs -getfacl /user/tao/test/log.txt
# file: /user/tao/test/log.txt
# owner: hdfs
# group: supergroup
user::rw-
user:tao:rwx
group::r--
mask::rwx
other::r--
[root@hadoop1 ~]# hdfs dfs -ls /user/tao/test/
Found 1 items
-rw-rwxr--+ 3 hdfs supergroup 485128 2015-12-03 20:23 /user/tao/test/log.txt
由于在执行setfacl命令前,该文件的owner是hdfs,所以要以用户hdfs的身份来执行setfacl命令才行。
关于权限标志位的顺序: 在命令hadoop dfs -setfacl -m user:hbase:rwx /user/tao/xt-data中,权限标志位rwx的顺序不能改变,否则会报错:-setfacl: Invalid permission in
正确的写法有: rwx, r-x, -r-, -rx等;
错误的写法有:wrx,w-x等。
可以为某个目录设置一个默认的ACL权限,使得以后在该目录中新建文件或者子目录时,新建的文件/目录的ACL权限都是之前设置的default ACLs。
命令为:
hdfs dfs -setfacl -m default:user:tao:rwx /user/tao/test/