FAILED: SemanticException No valid privileges User p55_u33_userchk does not have privileges for LOAD

本文详细解析了在大数据平台使用Sentry进行权限控制时遇到的LOAD操作权限问题,并提供了具体的解决步骤,包括通过beeline连接hive库,查找对应角色,以及如何正确地为角色授予目录权限。

场景:大数据平台使用sentry做权限控制。使用代理用户从后台直接在hdfs上创建了目录/sap/webservice,将数据put到此目录,然后load数据到hive表中报错如下:

Caused by: org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: SemanticException No valid privileges
 User p55_u33_userchk does not have privileges for LOAD
 The required privileges: Server=server1->URI=hdfs://XXX/sap/webservice/Bankage_2019-10-30->action=*;
	at org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:374)
	at org.apache.hive.service.cli.operation.SQLOperation.prepare(SQLOperation.java:136)
	at org.apache.hive.service.cli.operation.SQLOperation.runInternal(SQLOperation.java:206)
	at org.apache.hive.service.cli.operation.Operation.run(Operation.java:316)
	at org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementInternal(HiveSessionImpl.java:430)
	at org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementAsync(HiveSessionImpl.java:405)
	at org.apache.hive.service.cli.CLIService.executeStatementAsync(CLIService.java:258)
	at org.apache.hive.service.cli.thrift.ThriftCLIService.ExecuteStatement(ThriftCLIService.java:506)
	at org.apache.hive.service.cli.thrift.TCLIService$Processor$ExecuteStatement.getResult(TCLIService.java:1313)
	at org.apache.hive.service.cli.thrift.TCLIService$Processor$ExecuteStatement.getResult(TCLIService.java:1298)
	at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
	at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
	at org.apache.hive.service.auth.TSetIpAddressProcessor.process(TSetIpAddressProcessor.java:56)
	at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:286)
	... 3 more
Caused by: org.apache.hadoop.hive.ql.parse.SemanticException: No valid privileges
 User p55_u33_userchk does not have privileges for LOAD
 The required privileges: Server=server1->URI=hdfs://XXX/sap/webservice/Bankage_2019-10-30->action=*;
	at org.apache.sentry.binding.hive.HiveAuthzBindingHook.postAnalyze(HiveAuthzBindingHook.java:357)
	at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:454)
	at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:311)
	at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1194)
	at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:1181)
	at org.apache.hive.service.cli.operation.SQLOperation.prepare(SQLOperation.java:134)
	... 15 more
Caused by: org.apache.hadoop.hive.ql.metadata.AuthorizationException: User p55_u33_userchk does not have privileges for LOAD
	at org.apache.sentry.binding.hive.authz.HiveAuthzBinding.authorize(HiveAuthzBinding.java:343)
	at org.apache.sentry.binding.hive.authz.HiveAuthzBindingHookBase.authorizeWithHiveBindings(HiveAuthzBindingHookBase.java:483)
	at org.apache.sentry.binding.hive.HiveAuthzBindingHook.postAnalyze(HiveAuthzBindingHook.java:340)
	... 20 more

从报错上大概可以看出,是sentry权限问题。

解决方法:
1,beeline 到hive库
beeline -u jdbc:hive2://xxx.xxx.xxx.xxx:10000/
2,找到用户p55_u33_userchk对应的role:p55_u33_userchk_r1(一般都是该用户名+_r1)
show roles
3,将此目录赋权给该用户对应的role
grant all on uri 'hdfs://XXX/sap/webservice/' to role p55_u33_userchk_r1
4,搞定~

### SQL 授权异常问题分析 当遇到 `SQLSTATE[HY000]` 和权限不足 (`AuthorizationException`) 的情况时,通常意味着客户端试图执行的操作被服务器拒绝。具体到用户 `ssm_pdc_sit_bind` 权限不足的问题,可以从以下几个方面进行排查和解决。 #### 用户权限配置不当 如果用户没有足够的权限来执行特定操作,则会收到类似的错误消息。可以通过以下命令检查用户的权限: ```sql SHOW GRANTS FOR 'ssm_pdc_sit_bind'@'%'; ``` 这将显示该用户拥有的所有权限[^1]。 #### 主机连接限制 有时即使用户名密码正确,但如果主机地址不在允许列表内也会报错。对于类似 `Host '%s' is not allowed to connect to this MySQL server` 这样的错误,需确认目标主机是否有访问权限: ```sql GRANT ALL PRIVILEGES ON *.* TO 'ssm_pdc_sit_bind'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` 上述语句授予了全局范围内的全部权限并刷新权限表以使更改生效。实际应用中应根据需求精确控制所授予权限的范围[^2]。 #### 锁定等待超时影响 虽然锁定等待超时不直接引起授权失败,但在高并发环境下可能导致某些事务无法正常完成而抛出异常。适当调整锁机制可以帮助缓解此类状况。例如修改 `innodb_lock_wait_timeout` 参数值可延长或缩短最大等待时间: ```ini [mysqld] innodb_lock_wait_timeout = 60 ``` 此设置增加了默认的5秒至60秒,给予更多的时间让其他事务释放所需资源[^3]。 #### 使用 SIGNAL 抛出自定义错误信息 为了更好地调试程序逻辑,在存储过程或者触发器内部可以利用SIGNAL语句主动返回自定义的状态码及描述文字给调用方知晓具体的失败原因: ```sql SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = 'User does not have sufficient privileges.'; ``` 这种方式有助于快速定位问题所在,并提供更清晰的日志记录[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值