简体   繁体   English

运行 scala 脚本以从 hive 获取数据时权限被拒绝?

[英]Permission denied when run a scala script to get data from hive?

i wanna to simulate different user to get their hive table data, however it seems that the env is always keep the original value.我想模拟不同的用户来获取他们的 hive 表数据,但是似乎 env 总是保持原始值。 what should i do to correct it.我该怎么做才能纠正它。

#!/bin/sh
exec scala -savecompiled "$0" "$@"
!#

import scala.sys.process._
val Array(db, table, user) = args
System.setProperty("HADOOP_USER_NAME", user)
val command = Seq("hive", "-e",
f"""SELECT * FROM `${db}`.`${table}` limit 5000""")
println(command)
command.!

and the error is as follows错误如下

Logging initialized using configuration in jar:file:/opt/cloudera/bugfix/hive_cdh5.14.4/runtime/hive-common-1.1.0-cdh5.14.4.jar!/hive-log4j.properties
FAILED: SemanticException Unable to determine if hdfs://**************** is encrypted: org.apache.hadoop.security.AccessControlException: Permission denied: user=11, access=READ, inode="****************":hive:hive:drwxrwx--x
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkAccessAcl(DefaultAuthorizationProvider.java:363)
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:256)
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkPermission(DefaultAuthorizationProvider.java:168)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:152)
    at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3887)
    at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3870)
    at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPathAccess(FSDirectory.java:3841)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPathAccess(FSNamesystem.java:6750)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getEZForPath(FSNamesystem.java:9403)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getEZForPath(NameNodeRpcServer.java:1653)
    at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.getEZForPath(AuthorizationProviderProxyClientProtocol.java:931)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getEZForPath(ClientNamenodeProtocolServerSideTranslatorPB.java:1382)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2281)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2277)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1924)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2275)

i.ll appreciate if u could do me a favor如果你能帮我一个忙,我将不胜感激

System.setProperty does not set environment variables. System.setProperty不设置环境变量。 As you commented, you'll need to export the variable via the shell environment before starting the Scala process.正如您所评论的,您需要在启动 Scala 进程之前通过 shell 环境导出变量。 Otherwise find a way to cause System.getenv() map to return the value you're trying to set否则找到一种方法使System.getenv()映射返回您尝试设置的值

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM