CDH环境下Hadoop平台最高权限用户是hdfs,属于supergroup组。默认HDFS会开启权限认证,所以操作时,需要将root用户切换到hdfs用户,否则会报错。
问题:
org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/recsys2021":hdfs:supergroup:drwxr-xr-x
drwxr-xr-x - hdfs supergroup 0 2021-07-07 17:05 /recsys2021
直接使用root用户创建目录也会有权限问题
hadoop fs -mkdir /ping
mkdir: Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
解决:
sudo -u hdfs hadoop fs -chown root /recsys2021
sudo -u hdfs hadoop fs -chmod 777 /recsys2021
hadoop fs -ls /
drwxrwxrwx - root supergroup 0 2021-07-07 17:05 /recsys2021
这样每次操作都需要添加权限不太方便,如yarn在调度时,通常会生成一些临时文件,执行完毕会删除,如果权限不够会导致出错。Hive和HBase读写hdfs,也很容易因为权限问题导致出错。但是关闭权限检查,任何用户都可以操作HDFS数据,数据安全性又没有保障,所以使用将用户添加到supergroup组的方式。
设置
通常会把 root 或者需要的用户添加到 supergroup组,但Linux下默认是没有supergroup组。
# Linux下默认是没有supergroup组的
# hadoop:x:994:hdfs,mapred,yarn
cat /etc/group
# 查看hdfs用户的组是hadoop
# hdfs:x:995:992:Hadoop HDFS:/var/lib/hadoop-hdfs:/sbin/nologin
cat /etc/passwd
所以,先在Linux添加supergroup组,把root用户添加到supergroup里,再同步权限到HDFS。
# Linux添加supergroup组
# supergroup:x:1003:
groupadd supergroup
# 将root添加到supergroup
# supergroup:x:1003:root
usermod -a -G supergroup root
# 同步系统权限信息到HDFS,会自动同步其他节点权限
# Refresh user to groups mapping successful for cdh-master/192.168.100.45:8020
# Refresh user to groups mapping successful for cdh-slave01/192.168.100.46:8020
su - hdfs -s /bin/bash -c "hdfs dfsadmin -refreshUserToGroupsMappings"
验证
hadoop fs -mkdir /ping
hadoop fs -ls /
drwxr-xr-x - root supergroup 0 2021-07-08 13:15 /ping