hive集成kerberos问题2

简介:
 上次说到hive cli和kerberos集成的问题,而访问hive的另一种方法就是使用hiveserver,hive 0.11之后为hiveserver2。hiveserver的可用性可以用beeline进行测试。
hiveserver有一个user impersonation的功能,可以把运行job的用户设置为提交job的用户,在hive0.11之前,这个参数是由hive.server2.enable.impersonation控制,hive0.11开始改成了hive.server2.enable.doAs(默认为true)。
hive 集成kerberos传入用户名的问题,在之前的博客已经提过。
由于线上使用jdbc连接hiveserver,在hiveserver2集成了kerberos之后需要做jdbc可用性的测试。

在使用jdbc+kerberos时,主要注意几个问题
1.链接字符串格式,其中user,password并不生效
jdbc:hive2://<host>:<port>/<db>;principal=<Server_Principal_of_HiveServer2>
比如Connection con = DriverManager.getConnection("jdbc:hive2://host:10000/cdnlog;principal=hdfs/host@KERBEROS_HADOOP", "user1", "");
在传入hiveserver2时,用户并不是user1
2.在有tgt cache时,传入的用户为当前tgt的用户(可以通过klist查看)
3.principal的名称和hiveserver2的主机名需要一致

其中主要注意第一点。
可用下面的代码进行测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import  java.sql.SQLException;
import  java.sql.Connection;
import  java.sql.ResultSet;
import  java.sql.Statement;
import  java.sql.DriverManager;
public  class  HiveJdbcClient {
   private  static  String driverName =  "org.apache.hive.jdbc.HiveDriver" ;
   public  static  void  main(String[] args)  throws  SQLException {
     try  {
       Class.forName(driverName);
     catch  (ClassNotFoundException e) {
       e.printStackTrace();
       System.exit( 1 );
     }
     Connection con = DriverManager.getConnection( "jdbc:hive2://host:10000/cdnlog;principal=hdfs/host@KERBEROS_HADOOP" "ericni" "1234" );
     Statement stmt = con.createStatement();
     String tableName =  "dd_log" ;
     stmt.execute( "drop table if exists "  + tableName);
     String createSql =  "create table "  + tableName +  " (tt string) LOCATION 'hdfs://bipcluster/tmp/dd_log' " ;
     stmt.execute(createSql);
     System.out.println( "create table sql is"  + createSql);
   }
}

通过上面的sql,发现最终hdfs文件系统中对应文件夹的属组并不是ericni(由于开启了doas,页不会是hdfs),而是tgt的用户。

查看执行的调用结果:

在建立连接时,调用了DriverManager类的getConnection的方法。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  Connection  getConnection(String url,
     String user, String password)  throws  SQLException {
     java.util.Properties info =  new  java.util.Properties();
     // Gets the classloader of the code that called this method, may
     // be null.
     ClassLoader callerCL = DriverManager.getCallerClassLoader();
     if  (user !=  null ) {
         info.put( "user" , user);     //调用java.util.Properties类的put方法,生成user的value
     }
     if  (password !=  null ) {
         info.put( "password" , password);   //生成password的value
     }
     return  (getConnection(url, info, callerCL));
}

然后调用org.apache.hive.jdbc.HiveConnection类

首先HiveConnection类的构造函数会解析传入的url参数和传入的设置。
并调用openTransport方法,传入参数为(uri, connParams.getHost(), connParams.getPort(), connParams.getSessionVars());
其中openTransport方法会判断是否是secure的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if  (!sessConf.containsKey(HIVE_AUTH_TYPE)
     || !sessConf.get(HIVE_AUTH_TYPE).equals(HIVE_AUTH_SIMPLE)){
   try  {
     if  (sessConf.containsKey(HIVE_AUTH_PRINCIPAL)) { 
       transport = KerberosSaslHelper.getKerberosTransport(
               sessConf.get(HIVE_AUTH_PRINCIPAL), host, transport);
     else  {
       String userName = sessConf.get(HIVE_AUTH_USER);
       if  ((userName ==  null ) || userName.isEmpty()) {
         userName = HIVE_ANONYMOUS_USER;
       }
       String passwd = sessConf.get(HIVE_AUTH_PASSWD);
       if  ((passwd ==  null ) || passwd.isEmpty()) {
         passwd = HIVE_ANONYMOUS_PASSWD;
       }
       transport = PlainSaslHelper.getPlainTransport(userName, passwd, transport);
     }
   catch  (SaslException e) {
     throw  new  SQLException( "Could not establish secure connection to "
               + uri +  ": "  + e.getMessage(),  " 08S01" );
   }
}
在上面的代码中,可以看到当sessConf中含有HIVE_AUTH_PRINCIPAL(即principal)关键字时,会调用KerberosSaslHelper类的getKerberosTransport方法,返回一个TTransport 对象,此时用户名和密码并不会传入,相反,传入的依次是principal,host和TTransport类。
关于在jdbc中怎么使用kerberos做用户的验证放在后面的文章中讲解。


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