@[toc]
报错
当我使用 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.callBlockingMethod(ClientNamenodeProtocolProtos.java)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:604)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:572)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:556)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1093)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:1043)
[2024-04-04 19:36:31] at org.apache.hadoop.ipc.Server$RpcCall.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)
报错显示,目前我登录的用户名为 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,妥妥的。