org.apache.hadoop.security.AccessControlException Permission denied: user=anonymous, access=WRITE...

文章描述了在使用HiveServer2执行DDL操作时遇到权限错误的情况,提供了两种解决方案:一是临时通过HDFS命令授权,但不建议;二是修改Hive和Hadoop配置文件,创建专用用户并赋予权限,确保操作安全。最后通过beeline验证权限是否正确设置。
摘要由CSDN通过智能技术生成

报错

当我使用 HiveServer2 远程连接对 Hive 进行 DDL 操作时,出现了权限错误,完整报错信息如下:

[2024-04-04 19:36:31] [08S01][1]
[2024-04-04 19:36:31] 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=anonymous, access=WRITE, inode=“/warehouse/ad/ods”:ad:ad:drwxr-xr-x
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:506)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:346)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermissionWithContext(FSPermissionChecker.java:370)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:240)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1943)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1927)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory.java:1886)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSDirMkdirOp.mkdirs(FSDirMkdirOp.java:60)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3405)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:1159)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:740)
[2024-04-04 19:36:31] at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol 2. c a l l B l o c k i n g M e t h o d ( C l i e n t N a m e n o d e P r o t o c o l P r o t o s . j a v a ) [ 2024 − 04 − 0419 : 36 : 31 ] a t o r g . a p a c h e . h a d o o p . i p c . P r o t o b u f R p c E n g i n e 2 2.callBlockingMethod(ClientNamenodeProtocolProtos.java) [2024-04-04 19:36:31] at org.apache.hadoop.ipc.ProtobufRpcEngine2 2.callBlockingMethod(ClientNamenodeProtocolProtos.java)[2024040419:36:31]atorg.apache.hadoop.ipc.ProtobufRpcEngine2Server P r o t o B u f R p c I n v o k e r . c a l l ( P r o t o b u f R p c E n g i n e 2. j a v a : 604 ) [ 2024 − 04 − 0419 : 36 : 31 ] a t o r g . a p a c h e . h a d o o p . i p c . P r o t o b u f R p c E n g i n e 2 ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:604) [2024-04-04 19:36:31] at org.apache.hadoop.ipc.ProtobufRpcEngine2 ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:604)[2024040419:36:31]atorg.apache.hadoop.ipc.ProtobufRpcEngine2Server P r o t o B u f R p c I n v o k e r . c a l l ( P r o t o b u f R p c E n g i n e 2. j a v a : 572 ) [ 2024 − 04 − 0419 : 36 : 31 ] a t o r g . a p a c h e . h a d o o p . i p c . P r o t o b u f R p c E n g i n e 2 ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:572) [2024-04-04 19:36:31] at org.apache.hadoop.ipc.ProtobufRpcEngine2 ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:572)[2024040419:36:31]atorg.apache.hadoop.ipc.ProtobufRpcEngine2Server P r o t o B u f R p c I n v o k e r . c a l l ( P r o t o b u f R p c E n g i n e 2. j a v a : 556 ) [ 2024 − 04 − 0419 : 36 : 31 ] a t o r g . a p a c h e . h a d o o p . i p c . R P C ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:556) [2024-04-04 19:36:31] at org.apache.hadoop.ipc.RPC ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:556)[2024040419:36:31]atorg.apache.hadoop.ipc.RPCServer.call(RPC.java:1093)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.Server R p c C a l l . r u n ( S e r v e r . j a v a : 1043 ) [ 2024 − 04 − 0419 : 36 : 31 ] a t o r g . a p a c h e . h a d o o p . i p c . S e r v e r RpcCall.run(Server.java:1043) [2024-04-04 19:36:31] at org.apache.hadoop.ipc.Server RpcCall.run(Server.java:1043)[2024040419:36:31]atorg.apache.hadoop.ipc.ServerRpcCall.run(Server.java:971)
[2024-04-04 19:36:31] at java.security.AccessController.doPrivileged(Native Method)
[2024-04-04 19:36:31] at javax.security.auth.Subject.doAs(Subject.java:422)
[2024-04-04 19:36:31] at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1878)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2976)
[2024-04-04 19:36:31] )

报错显示,目前我登录的用户名为 anonymous,也就是匿名(游客)模式,但正在执行一个写操作,被拒绝了。

解决方法

方法1

通过 HDFS 命令对操作目录授权。

hdfs dfs -chmod -R +777 /warehouse

但是该方法治标不治本,而且我们处于匿名模式下也不安全,如果是测试环境则可以通过手动授权的方式快速解决。

方法2

既然是因为我们的用户权限问题,那么可以通过创建一个拥有权限的用户不就能解决了,这种方式还更加安全。

修改 Hive 的配置文件 hive-site.xml,在其中添加权限用户:

		<property>
	        	<name>hive.users.in.admin.role</name>
	        	<value>ad</value>
		</property>	

修改 Hadoop 的配置文件 core-site.xml,在其中添加如下配置项:

    <!-- 设置集群的连接用户 -->
    <property>
    	<name>hadoop.proxyuser.ad.hosts</name>
    	<value>*</value>
    </property>

    <property>
   	<name>hadoop.proxyuser.ad.groups</name>
    	<value>*</value>
    </property>

配置项中的 ad 为我们在 Hive 中配置的对应用户。

配置完成后,同步 core-site.xml 文件到其它机器。

重启 Hadoop、Hive 元数据服务、HiveServer2 服务。

测试

beeline

!connect jdbc:hive2://hadoop201:10000

用户名为我们上面在 Hive 中配置的用户名,密码回车跳过即可,无需输入。

在这里插入图片描述

上面通过 beeline 连接方式创建了库 aaa,检查是否还有权限报错问题。

在这里插入图片描述

创建完成,没有错误,我们在 HDFS 上检查一下该目录的所属组:

在这里插入图片描述

OK,妥妥的。

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮给我抄代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值