平台:具有6个节点的HDP3集群
从datanode( non-NameNode )
目标:让新用户创建一个数据库,并在其中创建一个表。简单。
这是我遵循的步骤,以及下面的错误:
[root@server:~]useradd lebowski // create user
[root@server:~]passwd lebowski
[root@server:~]usermod -a -G hadoop lebowski // add user to hadoop group
[root@server:~]su lebowski
[lebowski@server:~]$ groups
lebowski hadoop //All good
[lebowski@server:~]$hive //same output & issues w/ beeline as well
0: jdbc:hive2://server.com> CREATE DATABASE dude;
0: jdbc:hive2://server.com> use dude;
0: jdbc:hive2://server.com> CREATE TABLE BIG (//table creation stuff goes here//);
错误:失败:执行错误,从以下代码返回代码1: org.apache.hadoop.hive.ql.exec.DDLTask。 MetaException(message:Got 例外:org.apache.hadoop.security.AccessControlException
权限被拒绝: user = lebowski ,access = EXECUTE, inode =“ / warehouse / tablespace / managed / hive / dude.db”: hive:hadoop:drwxrwx ---
现在您可以看到:hdfs上的 dude.db 文件由 hive 拥有,并归于“ hadoop”组
dude.db:hive:hadoop:drwxrwx---
令人惊讶的事实:
-由于hive.server2.enable.doAs
设置为true,因此HiveServer2应该在用户提交查询时执行Hive操作。
-数据库所有者为hive
,尽管提交查询的用户为lebowski
。
-但是,表创建已链接到用户lebowski
,该用户在尝试写入先前在hdfs中创建的数据库文件夹时被拒绝。
我尝试过的事情:
我尝试将hadoop.security.group.mapping
强制设为ShellBasedUnixGroupsMapping
,但这会导致NameNode重新启动失败,因此我将其恢复为默认(Jni)。
我还尝试刷新组映射:hdfs dfsadmin -refreshUserToGroupsMappings
问题:为什么在同一上下文中使用一个技术用户在hdfs(在数据库创建的情况下为 hive )上写数据,而实际用户(lebowski)在在下一条语句中创建表?
另一个令人费解的事情是,我确保用户(lebowski)在“ hadoop”用户组中。
从逻辑上讲,不应引发此错误:用户所在的组对hdfs文件夹具有rwx
权限。
一个可能的解释是本文的出发点:“ unix”用户lebowski是从数据节点创建的,因此我不确定它如何传播到整个集群
另一个线索是“ Hive角色管理和授权”,它可以与基于POSIX的权利和许可进行交叉/干扰/覆盖。
可能的解决方法:我可以以hdfs或hive的方式连接,也可以通过chmod
强制进入,但是我想一次来完成生产工作友好的方式,从书上讲,而不是破解我的方式。
其他信息:
已安装Ranger,但未激活Hive插件
hive.security.authorization.manager
设置为
org.apache.hadoop.hive.ql.security.authorization.plugin.fallback.FallbackHiveAuthorizerFactory
hive.security.authorization.enabled
设置为true
欢迎任何开明的想法。