java如何通过Kerberos认证方式连接hive

2025-02-11 17:50

本文主要是介绍java如何通过Kerberos认证方式连接hive,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过...

在数据源管理功能中,需要适配mysqlPostgreSQL、hive等数据源。

mysql和postgresql连接方式一致,只需要驱动和jdbcurl即可,而hive背后是大数据集群,多采用Kerberos的方式保护集群环境,要想与大数据集群正常交互,需要经过kdc认证获取ticket,因此获取hive连接前需要先通过Kerberos认证

Java实现Kerberos认证

主要方法

# 从keytab文件中加载用户标识并登录
org.apache.hadoop.security.UserGroupInformation#loginUserFromKeytab

依赖

kerberos相关配置文件:krb5.conf、keytab文件从大数据集群管理员那获取

依赖:hive-jdbc:3.1.3(hive安装目录中带有该驱动包,可查看使用的版本)、hadoop-common:3.3.6,版本需和hive服务版本一致,在springboot3的框架下需要排除以下依赖,否则启动报错

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-jdbc</artifactId>
编程    <versionjs>${hive.jdbc.version}</version>
    <exclusions>
        <exclusion>
            <artifactId>HikariCP-java7</artifactId>
            <groupId>com.zaxxer</groupId>
 China编程       </exclusion>
        <exclusion>
            <artifactId>javax.servlet.JSP</artifactId>
            <groupId>org.glassfish.web</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jetty-runner</artifactId>
            <groupId>org.eclipse.jetty</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>${hadoop.version}</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-lang3</artifactId>
            <groupId>org.apache.commons</groupId>
        </exclusion>
        <exclusion>
            <artifactId>curator-client</artifactId>
            <groupId>org.apache.curator</groupId>
        </exclusion>
    </exclusions>
</dependency>

示例

String confPath = "\xxx\krb5.conf";
String keytabPath = "\xxx\hive.service.keytab";
String principal = "hive/xxx@xxx";

System.setProperty("java.security.krb5.conf", confPath);
//System.setProperty("sun.security.krb5.debug", "true");
//System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
Configuration configuration = new Configuration();
configuration.set("hadoop.security.authentication", "KERBEROS");

UserGroupInformation.setConfiguration(configuration);
try {
    UserGroupInformation.loginUserFromKeytab(principal, keytabPath);
} catch (IOException e) {
    log.error("authKerberos exception", e);
    throw new BizException("kerberos认证失败");
}

除了上述方式外,也可采用JAAS可插拔的认证模块进行Kerberos认证

续期

Kerberos的ticket存在有效期,过期后导致服务不可用

Kerberos ticket存在两种有效期,ticket timelife(票据生命周期)、renewable lifetime(可再生周期)

  • ticket的时间超过ticket lifetime时,该ticket将不可用
  • 在renewable lifetime的时间内,可以对即将过期的ticket进行续期,超过renewable lifetime时间后,无法续期
  • 例如kerb5.conf文件中的配置:ticket_lifetime = 24h renewable_lifetime = 7d,则在登录后的24小时内,可以对即将过期的ticket进行续期,距第一次登录7天后,将不再允许续期

UserGroupInformation提供了认证续期的私有方法UserGroupInformation#reloginFromKeytab(boolean),该方法有两个触发入口UserGroupInformation#checkTGTAndReloginFromKeytabUserGroupInformation#reloginFromKeytab()

java如何通过Kerberos认证方式连接hive

java如何通过Kerberos认证方式连接hive

值得注意的是

UserGroupInformation#loginUserFromKeytab

方法中会开启异步任务,定时触发续期方法,触发的续期方法即是

UserGroupInformation#reloginFromKeytab()

java如何通过Kerberos认证方式连接hive

java如何通过Kerberos认证方式连接hive

向线程池中提交续期的任务

java如何通过Kerberos认证方式连接hive

java如何通过Kerberos认证方式连接hive

也可以自定义触发续期的逻辑, 定期触发

UserGroupInformation.getLoginUser().checkTGTAndReloginFromKeytab()

连接hive

Kerberos认证之后,使用hive-jdbc连接hive,之后与连接mysql、pg的方式无异,使用DriverManager或数据源连接池Hikari皆可

遇到的问题

一开始选择hadoop-common的版本是3.1.3,执行Kerberos认证时报错

java如何通过Kerberos认证方式连接hive

KerberosUtil无法访问sun.security.krb5.Config(它在java.security.jgss模块中)。

分析

本项目采用的框架是spring boot3版本,最低要求的jdk版本是17,而Java在9之后引入了模块化机制,模块必须显式声明他们要到导出的包以供其他模块使用。

但是java.security.jgss模块的module-info.class文件中并未声明

java如何通过Kerberos认证方式连接hive

解决方式

1.在JVM的启动参数上增加以下参数

--add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED

2.升级hadoop-common版本到3.3.6

在该版本中KerberosUtil并未通过反射访问sun.security.krb5.Config

  • hadoop-common:3.1.3版本的KerberosUtipSnzFIhxsl

java如何通过Kerberos认证方式连接hive

hadoop-common:3.3.6版本的KerberosUtil

java如何通过Kerberos认证方式连接hive

扩展

利用JAAS机制认证Kerberos,不再使用UserGroupInformation进行认证

增加一个配置文件gss-jaas.conf

com.sun.security.jgss.initiate{
   com.sun.security.auth.module.Krb5LoginModule required
   doNotPrompt=true
   useTicketCache=true
  编程 useKeyTab=true
   renewTGT=true
   debug=true
   ticketCache="/kerberos-tmp/krb5cc_1000"
   keyTab="D:\\xxxx\\hive.service.keytab"
   principal="hive/xxxx@xxxx";
 };
private void authKerberos1() {
    // 指定gss-jaas.conf文件路径
    System.setProperty("java.security.auth.login.config", "D:\\xxx\\gss-jaas.conf");
    // System.setProperty("sun.security.jgss.debug", "true");
    System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
    String confPath = "D:\\xxxx\\krb5.conf";
    System.setProperty("java.security.krb5.conf", confPath);
}

思考

有时我们开发的系统是要部署到客户现场使用,而客户现场使用的hive版本和司内环境使用的版本可能不同。一般在程序开发时使用的依赖版本皆是定义在pom文件中,一旦打包之后依赖的版本就是固定的。因此需要考虑程序可适配不同的hive-jdbc版本,能够动态加载不同版本的hive-jdbc,或者在项目启动时可以指定额外的hive-jdbc驱动包

  • 使用类加载器在程序运行时动态从指定路径读取并加载指定的驱动jar包
URLClassLoader loader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
Class.forName(driverName, true, loader);
  • 在项目启动时能够将指定的目录中的jar包放到类路径中

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于java如何通过Kerberos认证方式连接hive的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:http://www.cppcns.com/ruanjian/java/700044.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1153398

相关文章

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

SpringBoot 中 CommandLineRunner的作用示例详解

《SpringBoot中CommandLineRunner的作用示例详解》SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口,实现功能的... 目录1、CommandLineRunnerSpringBoot中CommandLineRunner的作用

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流