簡體   English   中英

運行 scala 腳本以從 hive 獲取數據時權限被拒絕?

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

我想模擬不同的用戶來獲取他們的 hive 表數據,但是似乎 env 總是保持原始值。 我該怎么做才能糾正它。

#!/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.!

錯誤如下

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)

如果你能幫我一個忙,我將不勝感激

System.setProperty不設置環境變量。 正如您所評論的,您需要在啟動 Scala 進程之前通過 shell 環境導出變量。 否則找到一種方法使System.getenv()映射返回您嘗試設置的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM