0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别

1 文档编写目的

在前面的文章《0550-6.1-如何将普通用户增加到HDFS的超级用户组supergroup》中Fayson介绍过如何将普通用户设置为HDFS的超级用户,从而可以让普通用户也可以执行如dfsadmin相关的功能,但对于HDFS服务来说还有一个管理员用户(dfs.cluster.administrators),无论是超级用户还是管理员用户默认都是hdfs,本文Fayson主要介绍如何将普通用户设置为HDFS的管理员用户。

  • 测试环境

1.CDH6.1

2.Redhat7.4

3.集群已启用Kerberos

4.集群已启用HDFS HA

2 Superuser和Administrator的区别

1.HDFS Superuser/Groups

专门用于HDFS上文件/文件夹的权限。

“无论文件或目录的权限如何,运行NameNode服务的用户(通常为hdfs)和dfs.permissions.superusergroup中定义的组的任何成员(默认为supergroup)都可以读,写或删除任何文件和目录。对于HDFS来说,它们就相当于Linux系统上的root。”

quote “Regardless of the permissions on a file or a directory, the user that the NameNode runs as (typically hdfs) and any member of the group defined in dfs.permissions.superusergroup (defaults to supergroup), can read, write, or delete any file and directory. As far as HDFS is concerned, they are the equivalent of root on a Linux system”

Also Reference:
https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html

2.HDFS Administrators

除了在hadoop-policy.xml中配置ACL之外,某些HDFS管理操作(比如强制HA故障转移),也只能是HDFS集群管理员才能操作。通过在hdfs-site.xml中的参数dfs.cluster.administrators中设置以逗号分隔的用户列表以及以逗号分隔组列表来配置管理员,用户列表和组列表之间需要有空格来隔开。空格前为空则表示用户列表为空,空格后为空则表示组列表为空。

Quote“ACL for the admins, this configuration is used to control who can access the default servlets in the namenode, etc. The value should be a comma separated list of users and groups. The user list comes first and is separated by a space followed by the group list, e.g. “user1,user2 group1,group2”. Both users and groups are optional, so “user1”, " group1", “”, “user1 group1”, “user1,user2 group1,group2” are all valid (note the leading space in " group1"). ‘*’ grants access to all users and groups, e.g. ‘*’, ‘* ’ and ’ *’ are all valid.”

参考:
https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

3 配置方法

1.Fayson的测试集群一共有4台机器,首先在4台机器都增加fayson1这个用户,使用“useradd fayson1”命令即可,同时在KDC中增加fayson1这个principal,如何增加这里省略,增加成功后做以下验证。

[root@ip-172-31-6-83 shell]# sh ssh_do_all.sh node.list "id fayson1"
[root@ip-172-31-6-83 shell]# kinit fayson1
[root@ip-172-31-6-83 shell]# klist

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第1张图片

2.通过CM进入HDFS服务的配置项,增加如下配置。

CM - HDFS- Configurations : NameNode Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml

<property>
 <name>dfs.cluster.administrators</name>
 <value>hdfs fayson1</value>
 </property>

注:配置的value中,前面的hdfs代表hdfs用户,空一格后fayson1代表的是用户组。

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第2张图片

保存配置更改,然后根据提示重启HDFS服务。

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第3张图片

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第4张图片

重启完成:

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第5张图片

3.获取两个NameNode的Service ID,首先从CM进入HDFS服务,并选择任意一个NameNode进入,点击“进程”。

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第6张图片

点击hdfs-site.xml

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第7张图片

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第8张图片

从配置中可以看出ip-172-31-4-105.ap-southeast-1.compute.internal的ID为namenode126,ip-172-31-6-83.ap-southeast-1.compute.internal的ID为namenode50。

4.用fayson1用户登录Kerberos,并执行haadmin相关的命令。

[root@ip-172-31-6-83 shell]# kinit fayson1
Password for fayson1@FAYSON.COM: 
[root@ip-172-31-6-83 shell]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: fayson1@FAYSON.COM

Valid starting       Expires              Service principal
03/09/2019 21:45:25  03/10/2019 21:45:25  krbtgt/FAYSON.COM@FAYSON.COM
        renew until 03/16/2019 21:45:25
[root@ip-172-31-6-83 shell]# hdfs haadmin -getServiceState namenode126
Operation failed: Access denied for user fayson1. Superuser privilege is required
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkSuperuserPrivilege(FSPermissionChecker.java:131)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkSuperuserPrivilege(FSNamesystem.java:4660)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.getServiceStatus(NameNode.java:1770)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getServiceStatus(NameNodeRpcServer.java:1715)
        at org.apache.hadoop.ha.protocolPB.HAServiceProtocolServerSideTranslatorPB.getServiceStatus(HAServiceProtocolServerSideTranslatorPB.java:131)
        at org.apache.hadoop.ha.proto.HAServiceProtocolProtos$HAServiceProtocolService$2.callBlockingMethod(HAServiceProtocolProtos.java:4464)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1729)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第9张图片

5.在所有节点增加supergroup组,并且将fayson1用户添加到supergroup组中。

groupadd supergroup
usermod -a -G supergroup fayson1
id fayson1

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第10张图片

6.再次使用fayson1用户登录Kerberos,并执行haadmin相关的管理员命令。

[root@ip-172-31-6-83 shell]# kinit fayson1
Password for fayson1@FAYSON.COM: 
[root@ip-172-31-6-83 shell]# hdfs haadmin -getServiceState namenode126
standby
[root@ip-172-31-6-83 shell]#

执行成功。

7.执行HA的故障切换。

首先从CM进入HDFS服务确认当前的Active NameNode为ip-172-31-6-83

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第11张图片

执行如下命令将Active NameNode切换到ip-172-31-4-105

[root@ip-172-31-6-83 shell]# hdfs haadmin -failover namenode50 namenode126
Failover to NameNode at ip-172-31-4-105.ap-southeast-1.compute.internal/172.31.4.105:8022 successful
[root@ip-172-31-6-83 shell]#

从CM的页面进行确认:

0564-6.1.0-HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别_第12张图片

4 总结

1.HDFS服务的superuser和administrator定位是不一样的,超级用户主要是指针对HDFS的文件或者文件夹的超级权限,而管理用户则主要是指对于HDFS服务的一些管理操作比如HA切换,具体可以参考本文的第二章。

2.如果不配置HDFS的dfs.cluster.administrators参数,而使用普通用户执行管理员相关操作时会报以下错误:

"Only Namenode, Secondary Namenode, and administrators may access this servlet"

3.配置HDFS的dfs.cluster.administrators参数的格式是比较复杂的,比较标准的如下格式:

<property>
 <name>dfs.cluster.administrators</name>
 <value>user1,user2 group1,group2</value>
 </property>

代表的是用户user1和user2,以及组group1和group2可以执行相关管理员操作,具体可以参考Apache官网的说明。

“ACL for the admins, this configuration is used to control who can access the default servlets in the namenode, etc. The value should be a comma separated list of users and groups. The user list comes first and is separated by a space followed by the group list, e.g. “user1,user2 group1,group2”. Both users and groups are optional, so “user1”, " group1", “”, “user1 group1”, “user1,user2 group1,group2” are all valid (note the leading space in " group1"). ‘*’ grants access to all users and groups, e.g. ‘*’, ‘* ’ and ’ *’ are all valid.”

4.在CDH中,对于dfs.cluster.administrators参数,hdfs用户是一个必须配置的值放在前面的用户列表里,比如本文示例的配置方法:

<property>
 <name>dfs.cluster.administrators</name>
 <value>hdfs fayson1</value>
 </property>

5.对于haadmin相关的操作,用户不仅需要配置到dfs.cluster.administrators参数中,还需要将该用户增加到supergroup中,否则会报以下错误:

Operation failed: Access denied for user fayson1. Superuser privilege is required
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkSuperuserPrivilege(FSPermissionChecker.java:131)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkSuperuserPrivilege(FSNamesystem.java:4660)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.getServiceStatus(NameNode.java:1770)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getServiceStatus(NameNodeRpcServer.java:1715)
        at org.apache.hadoop.ha.protocolPB.HAServiceProtocolServerSideTranslatorPB.getServiceStatus(HAServiceProtocolServerSideTranslatorPB.java:131)
        at org.apache.hadoop.ha.proto.HAServiceProtocolProtos$HAServiceProtocolService$2.callBlockingMethod(HAServiceProtocolProtos.java:4464)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1729)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

6.但是对于hdfs dfsadmin -fetchImage这个命令,则只需要将普通用户配置到dfs.cluster.administrators参数中就可以了,不用增加到supergroup中。更多其他管理员相关操作命令,Fayson就不逐一验证了。

你可能感兴趣的:(Hadoop实操)