1.问题复现
- 测试环境:
1.RedHat7.2
2.CM和CDH版本6.2.0
3.集群启用Kerberos且启用Sentry服务
在测试环境下给fayson赋予了test库的CREATE/REFRESH/SELECT权限
在命令行使用fayson用户访问Impala并进行建表操作,执行如下SQL语句时提示没有INSERT权限
create table test_b stored as parquet as select * from test;
2.解决办法
在Impala中遇到上述问题可以通过如下方式解决,将上述的SQL语句拆分为如下方式:
create table test_c like test stored as parquet;insert overwrite test_c select * from test;
在Hive中可以直接使用上述的SQL语句执行不需要做相应的修改
create table test_b stored as parquet as select * from test;
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进行修改。