我在启用了文件系统权限的专用群集上运行Hadoop 2.6.2。群集的密码文件只有像hadoop这样的系统用户,没有个人帐户。我从具有个人帐户的linux边缘节点访问DFS(' clott')。
问题在于我无法写入模式775和组hadoop的DFS目录('共享');边缘节点显示我是hadoop组的成员。我认为边缘节点上的用户组成员资格将被使用,但不是吗?这就是我所看到的:
clott@edge$ id
uid=1003(clott) gid=1003(clott) groups=1003(clott),27(sudo),1001(hadoop)
clott@edge$ hdfs dfs -ls /user/hadoop
Found 3 items
drwxr-xr-x - hadoop hadoop 0 2015-12-03 16:55 /user/hadoop/DistributedShell
drwxrwxr-x - hadoop hadoop 0 2015-12-22 09:25 /user/hadoop/shared
clott@edge$ hdfs dfs -mkdir /user/hadoop/shared/foo
mkdir: Permission denied: user=clott, access=WRITE, inode="/user/hadoop/shared":hadoop:hadoop:drwxrwxr-x
我检查了名称节点,并在其日志中找到了此警告:
2015-12-22 09:32:40,941 WARN org.apache.hadoop.security.UserGroupInformation: No groups available for user clott
这有点道理 - 名称节点不授予我访问权限,因为它不能识别我的任何组。
那么name节点如何查找组成员身份?一些谷歌搜索似乎建议我必须将我的用户名和各种组添加到集群,但这听起来不对。当然,如果我将DFS目录模式设置为777,这是有效的,但那不对。
请提前帮助,谢谢。
答案 0 :(得分:2)
hadoop.security.group.mapping
(如here所述)的定义是:
用于对ACL进行分组映射(获取给定用户的组)的类。 默认实现, org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback,将 确定Java本机接口(JNI)是否可用。如果是JNI 可用的实现将使用hadoop内的API来解决 用户的组列表。如果JNI不可用那么shell 实现,使用ShellBasedUnixGroupsMapping。这个 使用bash实现shell到Linux / Unix环境 -c groups命令用于解析用户的组列表。
为了实现您的目标,您需要在NameNode计算机上添加您的用户帐户(clott)并将其添加到hadoop组。
如果您要与您的用户一起运行MapReduce,您也需要在NodeManager主机上配置您的用户帐户。