HDFS NFS 位置使用奇怪的数字用户名值作为目录权限

HDFS NFS locations using weird numerical username values for directory permissions

在 NFS 安装的 HDFS 位置的文件夹权限中看到用户名的无意义值,而 HDFS 位置本身(使用 Hortonworks HDP 3.1)看起来很好。例如

➜  ~ ls -lh /nfs_mount_root/user
total 6.5K
drwx------. 3 accumulo  hdfs    96 Jul 19 13:53 accumulo
drwxr-xr-x. 3  92668751 hadoop  96 Jul 25 15:17 admin
drwxrwx---. 3 ambari-qa hdfs    96 Jul 19 13:54 ambari-qa
drwxr-xr-x. 3 druid     hadoop  96 Jul 19 13:53 druid
drwxr-xr-x. 2 hbase     hdfs    64 Jul 19 13:50 hbase
drwx------. 5 hdfs      hdfs   160 Aug 26 10:41 hdfs
drwxr-xr-x. 4 hive      hdfs   128 Aug 26 10:24 hive
drwxr-xr-x. 5 h_etl   hdfs   160 Aug  9 14:54 h_etl
drwxr-xr-x. 3    108146 hdfs    96 Aug  1 15:43 ml1
drwxrwxr-x. 3 oozie     hdfs    96 Jul 19 13:56 oozie
drwxr-xr-x. 3 882121447 hdfs    96 Aug  5 10:56 q_etl
drwxrwxr-x. 2 spark     hdfs    64 Jul 19 13:57 spark
drwxr-xr-x. 6 zeppelin  hdfs   192 Aug 23 15:45 zeppelin
➜  ~ hadoop fs -ls /user
Found 13 items
drwx------   - accumulo   hdfs            0 2019-07-19 13:53 /user/accumulo
drwxr-xr-x   - admin      hadoop          0 2019-07-25 15:17 /user/admin
drwxrwx---   - ambari-qa  hdfs            0 2019-07-19 13:54 /user/ambari-qa
drwxr-xr-x   - druid      hadoop          0 2019-07-19 13:53 /user/druid
drwxr-xr-x   - hbase      hdfs            0 2019-07-19 13:50 /user/hbase
drwx------   - hdfs       hdfs            0 2019-08-26 10:41 /user/hdfs
drwxr-xr-x   - hive       hdfs            0 2019-08-26 10:24 /user/hive
drwxr-xr-x   - h_etl    hdfs            0 2019-08-09 14:54 /user/h_etl
drwxr-xr-x   - ml1        hdfs            0 2019-08-01 15:43 /user/ml1
drwxrwxr-x   - oozie      hdfs            0 2019-07-19 13:56 /user/oozie
drwxr-xr-x   - q_etl hdfs            0 2019-08-05 10:56 /user/q_etl
drwxrwxr-x   - spark      hdfs            0 2019-07-19 13:57 /user/spark
drwxr-xr-x   - zeppelin   hdfs            0 2019-08-23 15:45 /user/zeppelin

请注意用户 ml1 和 q_etl 的区别,当在 NFS 位置上 运行 ls 时,他们有数字用户值,而不是他们的用户名。 甚至做类似...

[hdfs@HW04 ml1]$ hadoop fs -chown ml1 /user/ml1

不更改 NFS 权限。更烦人的是,当尝试以 root 身份更改 NFS 挂载权限时,我们看到

[root@HW04 ml1]# chown ml1 /nfs_mount_root/user/ml1
chown: changing ownership of ‘/nfs_mount_root/user/ml1’: Permission denied

这会导致真正的问题,因为不同的 uid 意味着我无法访问这些目录,即使 "correct" 用户无法写入它们。不知道该怎么做。有更多 Hadoop 经验的人有任何调试建议或修复吗?


更新:

做更多的测试/调试,发现规则似乎是...

  1. 如果 NFS 服务器节点没有与访问 NFS 安装的节点上的用户 uid 相匹配的 uid(或 gid?),我们会得到奇怪的 uid 值,如此处所示。
  2. 如果有一个 uid 与请求节点上的用户名相关联,那么这就是我们在通过 NFS 访问时看到分配给该位置的 uid 用户(即使 NFS 服务器节点上的 uid 是实际上不是针对请求用户),例如
[root@HW01 ~]# clush -ab id ml1
---------------
HW[01,04] (2)
---------------
uid=1025(ml1) gid=1025(ml1) groups=1025(ml1)
---------------
HW[02-03] (2)
---------------
uid=1027(ml1) gid=1027(ml1) groups=1027(ml1)
---------------
HW05
---------------
uid=1026(ml1) gid=1026(ml1) groups=1026(ml1)
[root@HW01 ~]# exit
logout
Connection to hw01 closed.
➜  ~ ls -lh /hdpnfs/user
total 6.5K
...
drwxr-xr-x. 6 atlas     hdfs   192 Aug 27 12:04 ml1
...
➜  ~ hadoop fs -ls /user
Found 13 items
...
drwxr-xr-x   - ml1        hdfs            0 2019-08-27 12:04 /user/ml1
...
[root@HW01 ~]# clush -ab id atlas
---------------
HW[01,04] (2)
---------------
uid=1027(atlas) gid=1005(hadoop) groups=1005(hadoop)
---------------
HW[02-03] (2)
---------------
uid=1024(atlas) gid=1005(hadoop) groups=1005(hadoop)
---------------
HW05
---------------
uid=1005(atlas) gid=1006(hadoop) groups=1006(hadoop)

如果想知道为什么我有,集群上的用户在集群节点上具有不同的 uid,请参阅此处发布的问题:How to properly change uid for HDP / ambari-created user?(请注意,hadoop 服务用户的这些奇怪的 uid 设置是由默认为 Ambari)。

在与更了解HDP hadoop的人交谈后,发现问题是在Ambari设置和运行最初安装hadoop集群时,可能已经有其他预先存在的用户在指定集群节点。

Ambari 通过为可用节点提供下一个可用 UID block of user UIDs 来创建其各种服务用户。然而,在节点上安装 Ambari 和 HDP 之前,我在 to-be namenode(和其他)上创建了一些用户,以便进行一些初始维护检查和测试。我应该以 root 身份执行此操作。添加这些额外的用户会抵消这些节点上的 UID 计数器,因此当 Ambari 在节点上创建用户并增加 UID 时,它从不同的起始计数器值开始。因此,UID 不同步并导致 HDFS NFS 出现问题。

为了解决这个问题,我...

  1. 使用 Ambari 停止所有 运行ning HDP 服务
  2. 转到 Ambari 中的服务帐户并复制所有预期的服务用户名称字符串
  3. 对于每个用户,运行 类似 id <service username> 的东西来获取每个用户的组。对于服务组(可能有多个成员),可以做类似 grep 'group-name-here' /etc/group 的事情。我建议这样做,因为默认用户和组的 Ambari 文档没有您可以在此处获得的一些信息。
  4. 使用userdelgroupdel删除所有Ambari服务用户和组
  5. 然后重新创建集群中的所有组
  6. 然后重新创建集群中的所有用户(如果节点上有其他用户而不是其他用户,可能需要指定 UID)
  7. 重新启动 HDP 服务(希望一切仍然 运行 就好像什么都没发生一样,因为 HDP 应该寻找文字字符串(而不是 UID)

对于最后一部分,可以使用clustershell之类的东西,例如

# remove user
$ clush -ab userdel <service username>
# check that the UID you want to use is actually available on all nodes
$ clush -ab id <some specific UID you want to use>
# assign that UID to a new service user
$ clush -ab useradd --uid <the specific UID> --gid <groupname> <service username>

要从每个节点获取最低的公共可用 UID,used...

# for UID
getent passwd | awk -F: '(>1000) && (<10000) && (>maxuid) { maxuid=; } END { print maxuid+1; }'
# for GID
getent passwd | awk -F: '(>1000) && (<10000) && (>maxuid) { maxuid=; } END { print maxuid+1; }'

Ambari 还为用户创建了一些 /home 目录。重新创建用户后,将需要更改目录的权限(也可以在那里使用类似 clush 的东西)。

* 请注意,这是一个巨大的痛苦,每当您添加另一个集群节点时,您都​​需要手动更正用户的 UID。我这样做是为了测试集群,但对于生产(或什至更大的测试),您应该只使用 Kerberos 或 SSSD + Active Directory。