我已经开发了一个自定义的身份验证提供程序,关于身份验证,一切似乎都不错:HiveServer2启动良好,并且已正确验证了身份验证的连接。甚至,简单的Hive查询也可以工作,例如show tables

问题是当我尝试从远程Hive客户端执行查询时。由于我已经通过传递凭据(用户+密码...了,实际上不是密码,这是一个 token ,但这并不重要)进行连接,并且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

有人可以帮我吗?

最佳答案

请检查是否分别在HiverServer2主机节点和Hive Metastore主机节点的步骤1和步骤2中将“hive.metastore.execute.setugi”设置为true。请注意,必须在客户端/网关节点,HiverServer2和Hive Metastore主机节点上都设置此属性。

参考:http://doc.mapr.com/display/MapR/Hive+User+Impersonation

07-24 09:49
查看更多