我已经开发了一个自定义身份验证器提供程序,在身份验证方面一切正常:HiveServer2启动良好,经过身份验证的连接已正确验证。甚至,简单的Hive查询也可以,例如show tables
。
问题是当我尝试从远程Hive客户端执行查询时。由于我已连接传递我的凭据(用户+密码......好吧,不是真正的密码,它是一个令牌,但这不相关),Hive配置已准备好进行模拟(见下文) ,我希望HiveServer2以我的用户身份执行查询。然而,它使用hive
用户,该用户对我的HDFS用户空间没有任何权限。
例如,如果我创建一个表:
> create external table mytable (name string, job string, age string) row format delimited fields terminated by ',' location '/user/frb/testdir'
Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.security.AccessControlException Permission denied: user=hive, access=EXECUTE, inode="/user/frb":frb:frb:drwxr-----
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:265)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:251)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:205)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:168)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5519)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3517)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:785)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:764)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2013)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2009)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1594)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2007)
)
关于相关的配置参数,这是我的配置(简化,而不是XML):
hive-site.xml
:
com.telefonica.iot.idm.endpoint=https://account.lab.fiware.org
hive.server2.enable.doAs=true
hive.server2.authentication=CUSTOM
hive.server2.custom.authentication.class=com.telefonica.iot.cosmos.hive.authprovider.OAuth2AuthenticationProviderImpl
core-site.xml
:
hadoop.proxyuser.hive.groups=*
hadoop.proxyuser.hive.hosts=*
您可以查看自定义Hive身份验证器提供程序代码here。
我正在使用Hive 0.13.0
有人可以帮助我吗?
答案 0 :(得分:0)
请检查" hive.metastore.execute.setugi"在HiverServer2主机节点和Hive Metastore主机节点中的步骤1和步骤2中分别设置为true。请注意,必须在客户端/网关节点,HiverServer2和Hive Metastore主机节点上都设置此属性。
答案 1 :(得分:0)
如果您的Hive受Kerberos保护,我需要对您的身份验证方式进行一些修改。 Kerberos不允许通过令牌
进行模拟