前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生产集群写入报错深入分析

生产集群写入报错深入分析

原创
作者头像
Bob hadoop
修改2021-01-14 18:05:24
8160
修改2021-01-14 18:05:24
举报
文章被收录于专栏:日常杂记日常杂记

业务反馈执行脚本报错如下

Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=lf_xl_bp, access=WRITE, inode="/serv/smartsteps/raw/events/mobile_web_data/2019":hdfs:supergroup:drwxr-xr-x

登录接口机查看上层目录权限,未发现lf_xl_bp权限异常

接着深入查看权限,本次账期为7月账期。

发现下层目录实际权限为r-x

解决办法:

业务侧验证问题解决

总结:权限问题为常见问题,需要研究的点在于实际权限effective:r_x

衍生实验测试

通过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目录

[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

[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权限

[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、方法一

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

1.把默认值022改成000保存配置重启过时服务

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

[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权限是不会因为修改配置而更新,需要重新创建该目录才可以。

方法二

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

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

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

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

[root@cdh3 ~]# hadoop fs -rmr /tmp/testacl/tt

[root@cdh3 ~]# hadoop fs -mkdir /tmp/testacl/tt

[root@cdh3 ~]# hadoop fs -getfacl /tmp/testacl/tt

当然如果在赋权时加上-R选项就可以继承目录权限,但这样权限会被放大。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

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