前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0786-5.16.2-HDFS Default ACL继承与umask冲突问题分析及解决

0786-5.16.2-HDFS Default ACL继承与umask冲突问题分析及解决

作者头像
Fayson
发布2020-06-20 14:18:22
1.8K0
发布2020-06-20 14:18:22
举报
文章被收录于专栏:Hadoop实操

问题描述

通过HDFS命令为目录设置用户和组的default acl权限,在该目录下创建的子目录时用户和组的权限与设置的default acl权限不一致,提示“#effective:r-x”

  • 测试环境

1.Redhat7.6

2.采用root用户操作

3.CM和CDH版本为5.16.2

4.HDFS启用ACL权限控制

问题复现

1.使用cdhadmin用户创建一个HDFS目录

代码语言:javascript
复制
[root@cdh2 ~]# kinit cdhadmin
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl

2.为huet用户和test组设置/tmp/testacl目录default acl权限为rwx

代码语言:javascript
复制
[root@cdh2 ~]# hadoop fs -setfacl -m default:user:huet:rwx /tmp/testacl
[root@cdh2 ~]# hadoop fs -setfacl -m default:group:test:rwx /tmp/testacl
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl

通过user::rwx,group::r-x,other::r-x可以看到与umask-mode定义的022一致(即777 && 022=755,刚好对应user、group、other的权限)

3.在/tmp/testacl目录下创建一个子目录tt,并查看acl权限

代码语言:javascript
复制
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl/tt

通过上图可以看到父目录设置的huet用户和test组的default acl权限为rwx,但是新建的子目录权限显示为user:huet:rwx #effective:r-x用户和组的写权限丢失。

问题分析

HDFS服务dfs.umaskmode, fs.permissions.umask-mode默认配置为022

rwx权限说明:

r(read)可读权限,对应数字为4

w(write)可写权限,对应数字为2

x(execute)可执行权限,对应数字为1

HDFS文件或目录的权限位是由9个权限位来控制,每三位为一组,他们分别是文件属主(Owner)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其它用户的读、写、执行。由于HDFS默认的umask为022,因此我们在HDFS上创建目录时目录的权限为755(即777 && 022 为 755),即test用户创建一个目录/tmp/test

1)owner对目录拥有rwx权限(7-0)

2)group对该目录只有r-x权限(7-2)

3)other user对该目录只有r-x权限(7-2)

因此这也就说明了为什么在我们为指定目录设置了default acl权限后,子目录会出现继承的权限与实际的设置的权限不一致问题,接下来主要介绍两种不同的方式修复问题。

问题解决

该问题在HDFS的JIRA中也有相应的记录具体链接如下:

https://issues.apache.org/jira/browse/HDFS-6962

4.1方法一

通过指定HDFS的umask配置参数方式解决问题,该方式可以通过CM界面配置全局的,也可以在自己当前命令操作节点修改hdfs-site.xml配置文件来实现。

1.把默认值022改成000

2.保存配置并回到CM主页重启过时服务

3.删除创建的tt子目录在重新创建

代码语言:javascript
复制
[root@cdh2 ~]# hadoop fs -rmr /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl/tt

注意:之前已创建的目录继承的ACL权限是不会因为修改配置而更新,需要重新创建该目录才可以。

4.2方法二

根据JIRA里面描述HDFS提供了,给的解决方法是通过在hdfs-site.xml配置中将dfs.namenode.posix.inheritance.enabled设置为true,开启此配置后在指定了default acl时则umask不起作用。

1.在CM界面修改配置 hdfs-site.xml的NameNode高级配置代码段(安全阀)dfs.namenode.posix.acl.inheritance.enabled为true,点击保存

2.由于该配置为NameNode的高级配置,只需要重启NameNode服务即可

3.删除创建的tt子目录在重新创建

代码语言:javascript
复制
[root@cdh3 ~]# hadoop fs -rmr /tmp/testacl/tt
[root@cdh3 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh3 ~]# hadoop fs -getfacl /tmp/testacl/tt

总结

1.针对HDFS Default ACL继承与umask冲突问题可以通过两种方式解决,一种是通过修改客户端配置umask即可,一种是为NameNode服务添加高级配置dfs.namenode.posix.acl.inheritance.enabled为true的方式解决,指定该配置后子目录在继承权限时无视umask配置。

2.对于NameNode高级配置代码段(安全阀)中的dfs.namenode.posix.acl.inheritan

ce.enabled的参数,在C5中默认是false,在C6中默认是true。

3.重新部署客户端配置之前就创建的子目录,更改客户端配置之后权限仍然会继承失败,只有在部署客户端之后创建的子目录才能正常继承父目录的权限。对于父目Default ACL的后续修改不影响现有子目录的ACL。

4.只有目录的的创建者也就是owner可以直接设置目录的ACL,否则需要以HDFS用户去给各个目录设置ACL。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档