hive集成kerberos问题1

简介:
 在hdfs+mapred+impala+kerberos运行正常后,开始测试hive+kerberos。hive0.11之后开始支持kerberos的验证,hive主要有两种访问方式,一种方法是shell运行,即直接运行hive命令,另一种方法时启动hiveserver,然后通过jdbc或odbc进行验证,其中第二种方法可以通过hive0.11的beeline进行测试。
在使用hive shell运行时,主要遇到下面几个问题:
1.权限验证问题。
在hive操作hdfs数据的时候,权限是分为两层的,一个是hive层面的权限控制,主要是控制表的权限,一个是hdfs文件的权限控制,控制用户的读写操作。
表的相关权限主要是写在hive的元数据库中,主要是TBL_PRIVS表(控制表的权限)和DB_PRIVS 表(控制库的权限)。
在开启kerberos之后,传入hive的用户名是principal的全名,比如hdfs/gxxxx@KERBEROS_HADOOP,而hive权限表中的PRINCIPAL_NAME 字段是hdfs,会导致没有表的权限,虽然可以通过update表来更改相应的PRINCIPAL_NAME 的值,但是实际使用中缺乏可运维性。在hdfs层面,有一个user mapping的功能(由hadoop.security.auth_to_local参数控制),默认会把principal的全名进行map,转换为unix的用户名形式。

2.hook的问题。
由于hive有grant的bug,因此线上使用了hook来做用户验证,即执行grant语法是会判断当前用户是否是hdfs用户,如果不是则报错,主要的代码如下(老毕提供):
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import  java.util.HashSet;
import  org.apache.hadoop.hive.ql.parse.ASTNode;
import  org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
import  org.apache.hadoop.hive.ql.parse.HiveParser;
import  org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
import  org.apache.hadoop.hive.ql.parse.SemanticException;
import  org.apache.hadoop.hive.ql.session.SessionState;
import  org.apache.commons.logging.Log;
import  org.apache.commons.logging.LogFactory;
public  class  AuthHook  extends  AbstractSemanticAnalyzerHook {
      static  final  private  Log LOG = LogFactory.getLog(AuthHook. class .getName());
      private  static  HashSet<String> adminlist =  new  HashSet<String>() {
           {add( "hdfs" );}
      };
      private  static  String adminstr =  "hdfs" ;
      @Override
      public  ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
                ASTNode ast)  throws  SemanticException {
           switch  (ast.getToken().getType()) {
           case  HiveParser.TOK_CREATEDATABASE:
           case  HiveParser.TOK_DROPDATABASE:
           case  HiveParser.TOK_CREATEROLE:
           case  HiveParser.TOK_DROPROLE:
           case  HiveParser.TOK_GRANT:
           case  HiveParser.TOK_REVOKE:
           case  HiveParser.TOK_GRANT_ROLE:
           case  HiveParser.TOK_REVOKE_ROLE:
                String userName =  null ;
                if  (SessionState.get() !=  null  && SessionState.get().getAuthenticator() !=  null ) {
                     userName = SessionState.get().getAuthenticator().getUserName();
                }
                LOG.debug( "authhook username = " +userName);
                if  (!adminlist.contains(userName.toLowerCase())) {
                     throw  new  SemanticException( "User:" +userName
                               " isn't ADMIN, please ask for "  + adminstr +  "." );
                }
                break ;
           default :
                LOG.debug( "AST type = " +ast.getToken().getType());
                break ;
           }
           return  ast;
      }
}

其中获取当前传入的用户名是通过 SessionState.get().getAuthenticator().getUserName();
集成了kerberos之后,在实际使用中会报
FAILED: SemanticException User:hdfs/xxxxx@KERBEROS_HADOOP isn't ADMIN, please ask for hdfs.的错误。

这两个问题的解决,借鉴了点评的patch:
即把ql/src/java/org/apache/hadoop/hive/ql/security/HadoopDefaultAuthenticator.java
中的this.userName = ugi.getUserName();改为
this.userName = ShimLoader.getHadoopShims().getShortUserName(ugi);


本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1381334,如需转载请自行联系原作者
相关文章
|
4月前
|
SQL 分布式计算 DataWorks
DataWorks报错问题之集成hive数据源报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
3月前
|
SQL 缓存 关系型数据库
ClickHouse(19)ClickHouse集成Hive表引擎详细解析
Hive引擎允许对HDFS Hive表执行 `SELECT` 查询。目前它支持如下输入格式: -文本:只支持简单的标量列类型,除了 `Binary` - ORC:支持简单的标量列类型,除了`char`; 只支持 `array` 这样的复杂类型 - Parquet:支持所有简单标量列类型;只支持 `array` 这样的复杂类型
149 1
|
2月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之如何使用Flink SQL连接带有Kerberos认证的Hive
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
SQL 分布式计算 Java
Apache Hudi与Hive集成手册
Apache Hudi与Hive集成手册
281 0
|
4月前
|
SQL 数据可视化 数据挖掘
将Sqoop与Hive集成无缝的数据分析
将Sqoop与Hive集成无缝的数据分析
|
4月前
|
SQL 存储 分布式计算
Spark与Hive的集成与互操作
Spark与Hive的集成与互操作
|
4月前
|
SQL 存储 Apache
流数据湖平台Apache Paimon(四)集成 Hive 引擎
流数据湖平台Apache Paimon(四)集成 Hive 引擎
369 0
|
9月前
|
分布式计算 Hadoop Java
hadoop sdk 优化小结(裁剪、集成kerberos组件、定制等)
hadoop sdk 优化小结(裁剪、集成kerberos组件、定制等)
65 0
|
2月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
161 6
|
2月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
187 4