Hive 查询报错:NoRouteToHost
官方文档:https://cwiki.apache.org/confluence/display/HADOOP2/NoRouteToHost
No Route to Host
IOException当网络上的一台机器不知道如何将 TCP 数据包发送到指定的机器时,您会收到 TCP No Route To Host 错误 - 通常包装在 Java中。
一些可能的原因(非排他性列表):
- 配置文件中远程机器的主机名错误
- 客户端的主机表/etc/hosts中的目标主机 IP 地址无效。
- DNS 服务器的主机表中的目标主机 IP 地址无效。
- 客户端的路由表(在 Linux 中为 iptables)是错误的。
- DHCP 服务器正在发布错误的路由信息。
- 客户端和服务器位于不同的子网上,并且未设置为相互通信。这可能是个意外,也可能是故意锁定 Hadoop 集群。
- 这些机器正在尝试使用 IPv6 进行通信。Hadoop目前不支持 IPv6
- 主机的 IP 地址已更改,但长期存在的 JVM 正在缓存旧值。这是 JVM 的一个已知问题(搜索“java 负 DNS 缓存”以获取详细信息和解决方案)。快速解决方案:重新启动 JVM
这些都是网络配置/路由器问题。由于它是您的网络,因此只有您才能发现并追踪问题。
Hive 库没有建表权限
报错信息:
hive> CREATE EXTERNAL TABLE ops_db.testttable_0999 (id
bigint);
CREATE EXTERNAL TABLE ops_db.testttable_0999 (id
bigint);
FAILED: HiveAccessControlException Permission denied: Principal [name=guest, type=USER] does not have following privileges for operation CREATETABLE [[OBJECT OWNERSHIP] on Object [type=DATABASE, name=ops_db]]
问题分析:
##1.使用使用超级管理员hadoop用户登录hive
hive> set role admin;
hive> set hive.cli.print.header=true;
hive> grant all on database ops_db to user guest;
hive> show grant user guest on database ops_db;
+------------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+------------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| ops_db | | | | guest | USER | DELETE | false | 1629294254000 | hadoop |
| ops_db | | | | guest | USER | INSERT | false | 1629294254000 | hadoop |
| ops_db | | | | guest | USER | SELECT | false | 1629294254000 | hadoop |
| ops_db | | | | guest | USER | UPDATE | false | 1629294254000 | hadoop |
+------------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
##2. 使用guest用户进入hive,执行建表语句报错
hive> create table ops_db.test1(id int) ;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: Principal [name=guest, type=USER] does not have
following privileges for operation CREATETABLE [[OBJECT OWNERSHIP] on Object [type=DATABASE, name=ops_db]] (state=42000,code=40000)
以为是hdfs目录权限问题,改变属组后仍然同样错误。
# sudo -u hdfs hadoop fs -ls /user/hive/warehouse/
# sudo -u hdfs hadoop fs -chmod -R 1777 /user/hive/warehouse/ops_db.db
# sudo -u hdfs hadoop fs -chown -R guset /user/hive/warehouse/ops_db.db
解决方法:使用超级管理员hadoop用户进入hive
##修改数据库ops_db的OWNER
ALTER DATABASE ops_db SET OWNER user guest;
- 再次使用guset用户建表成功,问题解决!!
- 但是将表的owner设置为guest后hadoop用户却没有权限
优雅解决方式:
##创建role_ops_db组
hive> set role admin;
hive> create role role_ops_db;
将hadoop和guset用户加入组中:
hive> GRANT ROLE role_ops_db TO USER hadoop;
hive> GRANT ROLE role_ops_db TO USER guset;
##赋予用户数据所有权限:
hive> grant all on database ops_db to user guest;
##将数据库ops_db的role设置成ops_db_role后,2个用户都有建表权限:
hive> ALTER DATABASE ops_db SET OWNER role role_ops_db;
##列出属于role_ops_db角色的所有角色和用户
hive> SHOW PRINCIPALS role_ops_db;
##检查权限
hive> show grant role role_ops_db on all;
hive> show grant user guset on all;
Hive 撤销权限失败
hive> show grant user hue_product on all;
OK
database table partition column principal_name principal_type privilege grant_option grant_time grantor
ops_dataprocess ops_game_event hue_product USER SELECT false 1659013480000 hive
hive> revoke select on table ops_dataprocess.ops_game_event from user hue_product;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot find privilege Privilege [name=SELECT, columns=null] for Principal [name=hue_product, type=USER] on Object [type=TABLE_OR_VIEW, name=ops_dataprocess.ops_game_event ] granted by root
原因分析:
从终端输出可以看出,ops_dataprocess.ops_game_event 的 SELECT权限授予者(grantor)是hive,所以切换到hive用户执行撤销命令即可。
解决方法:
# su hive -s /bin/bash -c 'hive'
hive> set role admin;
set role admin;
OK
Time taken: 0.449 seconds
hive> revoke select on table ops_dataprocess.ops_game_event from user hue_product;
OK
Time taken: 0.093 seconds