0651-6.2.0-启用Sentry后Impala执行SQL失败问题分析

2019-06-17 18:34:45 浏览数 (1)

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

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实操

0 人点赞