hive插入表的insert 执行计划_0651-6.2.0-启用Sentry后Impala执行SQL失败问题分析

1.问题复现

  • 测试环境:

1.RedHat7.2

2.CM和CDH版本6.2.0

3.集群启用Kerberos且启用Sentry服务

在测试环境下给fayson赋予了test库的CREATE/REFRESH/SELECT权限

9aa77f8925e88360f599073c33d7b424.png

在命令行使用fayson用户访问Impala并进行建表操作,执行如下SQL语句时提示没有INSERT权限

create table test_b stored as parquet as select * from test;
80515432d8ba2a1fe46b11225c832557.png

2.解决办法

在Impala中遇到上述问题可以通过如下方式解决,将上述的SQL语句拆分为如下方式:

create table test_c like test stored as parquet;insert overwrite test_c select * from test;
29262d9d12ac612e6eb21cdd736e5e60.png

在Hive中可以直接使用上述的SQL语句执行不需要做相应的修改

create table test_b stored as parquet as select * from test;
3f348a4b8344fbda829f5e2b85a89053.png

3.总结

Impala和Hive在运行CREATE TABLE .. AS SELECT这个命令的时候检查Sentry权限的方式是不一样的。

在Hive,只要有CREATE权限的话就认为这个用户会是table的owner,所以Hive允许有CREATE权限的用户(没有INSERT)运行CREATE TABLE .. AS SELECT这个命令。

在Impala上,在运行CREATE TABLE .. AS SELECT这个命令的时候,用户不仅需要CREATE权限,也需要INSERT权限的情况下才会让用户运行这个命令(因为Impala认为在运行这个命令之前user还不是这个table的owner,Impala需要检查当前的状态)。

Impala和Hive这两个服务在处理Sentry权限的时候处理方式的不一样才会导致这样的结果,这是由于Impala和Hive是由不同的团队开发的不同的服务,而在跟Sentry集成的时候针对Sentry管理的理解不一样导致的。

举例如下:

启用Sentry的CDH集群中,用户或组拥有库的CREATE/REFRESH权限后,遇到create table xxx stored as parquet as select * from bbb语法时(注意用户需拥有bbb表的select权限),在Hive和Impala中的处理方式如下:

1.在Impala中需要将上述SQL拆分为两条语句,先创建表然后再进行插入数据操作,如果直接执行上述语句则会提示需要创建的那张表xxx的INSERT权限。

2.在Hive中则可以直接执行,无需对SQL进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值