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