hive show current roles问题

今天hive user maillist上有人问show current roles命令问题:


1

2

3

4

5

6

I am trying to run ‘Show current roles’ on Apache hive 0.13.1 but getting following error,

hive> SHOW CURRENT ROLES;

Error in role operation show_current_role on role name null, error message Unkown role operation show_current_role

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

Can someone tell me whether this command is supported on apache Hive 0.13.1 or not. If it is supported the what could be the issue.

Any pointer would be really helpful.

在我的印象中,这个命令应该不存在才对。。手动运行了一下,果然报错,仔细看日志,可以看到命令式可以完成parse和analyzer阶段的,运行的时候报错,

按我的理解,如果sql不支持的话应该在parse阶段就会出错


1

2

3

4

5

6

7

8

9

14/11/20 11:22:55 INFO ql.Driver: Starting command: show current roles

14/11/20 11:22:55 INFO log.PerfLogger: </PERFLOG method=TimeToSubmit start=1416453775411 end=1416453775795 duration=384 from=org.apache.hadoop.hive.ql.Driver>

14/11/20 11:22:55 INFO log.PerfLogger: <PERFLOG method=runTasks from=org.apache.hadoop.hive.ql.Driver>

14/11/20 11:22:55 INFO log.PerfLogger: <PERFLOG method=task.DDL.Stage-0 from=org.apache.hadoop.hive.ql.Driver>

Error in role operation show_current_role on role name null, error message Unkown role operation show_current_role

14/11/20 11:22:55 ERROR exec.Task: Error in role operation show_current_role on role name null, error message Unkown role operation show_current_role

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

14/11/20 11:22:55 ERROR ql.Driver: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

14/11/20 11:22:55 DEBUG ql.Driver: Shutting down query show current roles

根据堆栈信息,show current roles命令是由DDLTask执行的,看其具体实现:


1

2

3

4

5

  private int roleDDL(RoleDDLDesc roleDDLDesc) throws HiveException, IOException {

    if(SessionState.get().isAuthorizationModeV2()){

      return roleDDLV2(roleDDLDesc);  //如果是v2的验证方式,调用roleDDLV2

    }

....

在roleDDLV2中可以看到show current role命令的处理:


1

2

3

4

5

6

7

8

9

10

11

    private int roleDDLV2(RoleDDLDesc roleDDLDesc) throws HiveException, IOException {

    HiveAuthorizer authorizer = SessionState.get().getAuthorizerV2();

    RoleDDLDesc.RoleOperation operation = roleDDLDesc.getOperation();

    //call the appropriate hive authorizer function

    switch(operation){

...

    case SHOW_CURRENT_ROLE:

      List<String> roleNames = authorizer.getCurrentRoleNames();

      writeListToFileAfterSort(roleNames, roleDDLDesc.getResFile());

      break;

...

即show current role这个语法在v2里面支持,那么什么时候SessionState.get().isAuthorizationModeV2()为true呢?来看看SessionState类,isAuthorizationModeV2调用getAuthorizationMode,getAuthorizationMode调用setupAuth:


1

2

3

4

5

6

7

8

9

10

11

12

13

public AuthorizationMode getAuthorizationMode(){

    setupAuth();   //调用setupAuth类设置authorizer和authorizerV2

    if(authorizer != null){

      return AuthorizationMode.V1;

    }else if(authorizerV2 != null){

      return AuthorizationMode.V2;

    }

    //should not happen - this should not get called before this.start() is called

    throw new AssertionError("Authorization plugins not initialized!");

  }

  public boolean isAuthorizationModeV2(){

    return getAuthorizationMode() == AuthorizationMode.V2;

  }

如果要让AuthorizationMode.V2成立,需要让authorizer为null,authorizerV2不为null才可以,设置


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

authorizer和authorizerV2是在setupAuth方法中实现的

  private HiveAuthorizationProvider authorizer;

  private HiveAuthorizer authorizerV2;

...

  private void setupAuth() {

    if (authenticator != null) {

      // auth has been initialized

      return;

    }

    try {

...

      authorizer = HiveUtils.getAuthorizeProviderManager(conf,

          HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER, authenticator, true);  //hive.security.authorization.manager 默认为org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider         

      if (authorizer == null) { //authorizer的值为null时,才可以有机会返回v2

        // if it was null, the new authorization plugin must be specified in

        // config

        HiveAuthorizerFactory authorizerFactory = HiveUtils.getAuthorizerFactory(conf,

            HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER);

        authorizerV2 = authorizerFactory.createHiveAuthorizer(new HiveMetastoreClientFactoryImpl(),

            conf, authenticator);

        authorizerV2.applyAuthorizationConfigPolicy(conf);

        // create the create table grants with new config

        createTableGrants = CreateTableAutomaticGrant.create(conf);

      }

..

因为hive.security.authorization.manager默认为org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider,所以为authorizer为V1,要想设置为v2,需要让HiveUtils.getAuthorizeProviderManager返回null

HiveUtils.getAuthorizeProviderManager中可以获取设置的authorizer的具体实现类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

  public static HiveAuthorizationProvider getAuthorizeProviderManager(

      Configuration conf, HiveConf.ConfVars authorizationProviderConfKey,

      HiveAuthenticationProvider authenticator, boolean nullIfOtherClass) throws HiveException {

    String clsStr = HiveConf.getVar(conf, authorizationProviderConfKey); //由hive.security.authorization.manager的设置获取类名

    HiveAuthorizationProvider ret = null;

    try {

      Class<? extends HiveAuthorizationProvider> cls = null;

      if (clsStr == null || clsStr.trim().equals("")) { //如果为null或者设置为空,则实现类为DefaultHiveAuthorizationProvider

        cls = DefaultHiveAuthorizationProvider.class;

      else {

        Class<?> configClass = Class.forName(clsStr, true, JavaUtils.getClassLoader()); //否则为具体的实现的类

        if(nullIfOtherClass && !HiveAuthorizationProvider.class.isAssignableFrom(configClass) ){ //配置的类和HiveAuthorizationProvider类没有关系时,返回null

          return null;

        }

        cls = (Class<? extends HiveAuthorizationProvider>)configClass;

      }

      if (cls != null) {

        ret = ReflectionUtils.newInstance(cls, conf);

      }

    catch (Exception e) {

      throw new HiveException(e);

    }

    ret.setAuthenticator(authenticator);

    return ret;

  }

如果要想返回v2,需要让设置的authorize相关类必须实现HiveAuthorizerFactory接口,且不能实现HiveAuthorizationProvider接口

反馈如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Refer to the org.apache.Hadoop.hive.ql.exec.DDLTask.roleDDL function, AuthorizationMode 

doesn‘t support  SHOW CURRENT ROLES statement

But AuthorizationModeV2 supports this:

private int roleDDLV2(RoleDDLDesc roleDDLDesc) throws HiveException, IOException {

…….

    case SHOW_CURRENT_ROLE:

      List<String> roleNames = authorizer.getCurrentRoleNames();

      writeListToFileAfterSort(roleNames, roleDDLDesc.getResFile());

      break;

But by default,hive uses AuthorizationMode (because the default value of 

hive.security.authorization.manager is

org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider,

which means AuthorizationMode )

If you want to use AuthorizationModeV2,you must use another authorization class

which implements the

org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizerFactory interface

but not the 

org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider interface

时间: 2024-10-13 16:19:45

hive show current roles问题的相关文章

[Hive - LanguageManual] Create/Drop/Grant/Revoke Roles and Privileges / Show Use

Create/Drop/Grant/Revoke Roles and Privileges Hive Default Authorization - Legacy Mode has information about these DDL statements: CREATE ROLE GRANT ROLE REVOKE ROLE GRANT privilege_type REVOKE privilege_type DROP ROLE SHOW ROLE GRANT SHOW GRANT For 

HADOOP docker(七):hive权限管理

1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户名密码2.4 授权2.4.1 角色管理2.4.2 权限管理2.4.3 操作与权限对应关系 文档链接: hive权限管理 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization#LanguageManu

hive集成sentry的sql使用语法

Sentry权限控制通过Beeline(Hiveserver2 SQL 命令行接口)输入Grant 和 Revoke语句来配置.语法跟现在的一些主流的关系数据库很相似.需要注意的是:当sentry服务启用后,我们必须使用beeline接口来执行hive查询,Hive Cli并不支持sentry. CREATE ROLE Statement CREATE ROLE语句创建一个可以被赋权的角色.权限可以赋给角色,然后再分配给各个用户.一个用户被分配到角色后可以执行该角色的权限. 只有拥有管理员的角色

HIVE 原理

Overview HiveQL DDL statements are documented here, including: CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX TRUNCATE TABLE ALTER DATABASE/SCHEMA, TABLE, VIEW MSCK REPAIR TABLE (or ALTER TABLE RECOVER P

[[Hive - LanguageManual ] ]SQL Standard Based Hive Authorization

Status of Hive Authorization before Hive 0.13 SQL Standards Based Hive Authorization (New in Hive 0.13) Restrictions on Hive Commands and Statements Privileges Objects Object Ownership Users and Roles Names of Users and Roles Role Management Commands

SQL Standard Based Hive Authorization(基于SQL标准的Hive授权)

说明:该文档翻译/整理于Hive官方文档https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization#SQLStandardBasedHiveAuthorization-ObjectPrivilegeCommands. Hive 0.13版本之前的授权现状   Hive默认授权(Default Hive Authorization (Legacy Mode)) 设计目的并不是为了防止恶

Hive 官方手册翻译 -- Hive DDL(数据定义语言)

Hive DDL(数据定义语言) Confluence Administrator创建, Janaki Lahorani修改于 2018年9月19日 原文链接 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 翻译:Google Google翻译,金山软件 金山词霸 校对:南大通用 范振勇 (2018.9.26) 一.概述 这里是HiveQL DDL语句的文档,其中包括: CREATE 数据库/SCHEMA,表

hive 优化 (转)

Hive优化 Hive优化目标 在有限的资源下,执行效率更高 常见问题 数据倾斜 map数设置 reduce数设置 其他 Hive执行 HQL --> Job --> Map/Reduce 执行计划 explain [extended] hql 样例 select col,count(1) from test2 group by col; explain select col,count(1) from test2 group by col; Hive表优化 分区 静态分区 动态分区 set

学习笔记--Impala

参考 https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_datetime_functions.html hdfs文件操作 $ whoami cloudera $ hdfs dfs -ls /user Found 3 items drwxr-xr-x - cloudera cloudera 0 2013-04-22 18:54 /user/cloudera drwxrwx--- - mapred mapred