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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错

当我使用 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,妥妥的。

0: jdbc:hive2://bigdata1:10000> select * from ods.crstomer_inf; Error: Error while compiling statement: FAILED: SemanticException [Error 10001]: Line 1:14 Table not found 'crstomer_inf' (state=42S02,code=10001) 0: jdbc:hive2://bigdata1:10000> select * from ods.customer_inf; Error: Error while compiling statement: FAILED: SemanticException Unable to determine if hdfs://bigdata1:9000/user/hive/warehouse/ods.db/customer_inf is encrypted: org.apache.hadoop.security.AccessControlException: Permission denied: user=anonymous, access=EXECUTE, inode="/user":root:supergroup:drwx------ at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:399) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:315) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:242) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:193) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:606) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1804) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1822) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.resolvePath(FSDirectory.java:677) at org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.getFileInfo(FSDirStatAndListingOp.java:114) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3131) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1173) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:973) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos
03-09
0: jdbc:hive2://bigdata1:10000> create table if not exists ods.customer_inf(customer_inf_id int,customer_id int,cuwtomer_name string,identity_card_type int,identity_card_no STRING,mobile_phone INT,customer_email STRING,gender STRING,customer_point INT,register_time TIMESTAMP,birthday TIMESTAMP,customer_level INT, customer_money FLOAT, modified_time TIMESTAMP)PARTITIONED BY (etl_date STRING) STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY"); Error: 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=EXECUTE, inode="/user":root:supergroup:drwx------ at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:399) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:315) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:242) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:193) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:606) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1804) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1822) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.resolvePath(FSDirectory.java:677) at org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.getFileInfo(FSDirStatAndListingOp.java:114) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3131) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1173) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProt
03-09
### Hadoop 权限拒绝问题解决方案 当遇到 `AccessControlException` 错误提示权限被拒,具体表现为用户无法获得写入访问权限时,这通常是因为文件系统的权限设置不正确。对于当前情况描述中的错误信息显示inode `/home/hadoop` 的权限为 `drwxr-xr-x` 并归属于 `supergroup` 组。 #### 修改目录权限 为了使指定用户能够拥有写权限,在不影响其他安全策略的前提下,可以考虑调整该路径下的权限位以允许组成员具有写权限: ```bash hdfs dfs -chmod 775 /home/hadoop ``` 上述命令会将目标位置的权限更改为 `drwxrwxr-x`, 即给予属主读取、写入和执行权限;给同组用户提供读取、写入以及执行权限;而其他用户仅保留读取与执行权限[^1]。 #### 添加用户到适当群组 如果希望特定用户能对该资源进行修改操作而不改变现有权限结构,则可将其加入对应的用户组(`supergroup`)中去: ```bash sudo usermod -aG supergroup username ``` 这里需替换 `username` 成实际需要授权的那个用户名字[^2]。 #### 配置核心站点属性 有时还需要检查并配置Hadoop集群的核心站点配置文件(core-site.xml),确保启用了正确的身份验证机制,并且设置了合适的代理用户规则来支持跨节点的数据处理需求[^3]: ```xml <property> <name>hadoop.proxyuser.<proxy-user>.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.<proxy-user>.groups</name> <value>*</value> </property> ``` 以上更改使得名为 `<proxy-user>` 的用户可以从任何主机作为任意群体运行作业。请注意这里的通配符(*)表示所有可能值, 实际部署环境中应依据安全性考量做相应限定。 完成这些改动之后记得重启相关服务以便让新的设定生效。另外建议定期审查日志记录寻找潜在的安全隐患或者性能瓶颈所在之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月亮给我抄代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值