温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github: https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1
问题复现
- 测试环境:
1.RedHat7.2
2.CM和CDH版本6.2.0
3.集群启用Kerberos且启用Sentry服务
在测试环境下给fayson赋予了test库的CREATE/REFRESH/SELECT权限
在命令行使用fayson用户访问Impala并进行建表操作,执行如下SQL语句时提示没有INSERT权限
代码语言:javascript复制create table test_b stored as parquet as select * from test;
2
解决办法
在Impala中遇到上述问题可以通过如下方式解决,将上述的SQL语句拆分为如下方式:
代码语言:javascript复制create table test_c like test stored as parquet;
insert overwrite test_c select * from test;
在Hive中可以直接使用上述的SQL语句执行不需要做相应的修改
代码语言:javascript复制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进行修改。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操