Kyuubi Hive JDBC 驱动
新增于 1.4.0 版本:Kyuubi 社区维护了一个 fork 的 Hive JDBC 驱动模块,并同时提供 shaded 和非 shaded 两种打包方式。
该包旨在支持原版 Hive JDBC 驱动所缺少的一些功能。对于支持多 catalog 的 Kyuubi 引擎,它提供了元数据 API 以提供更好的支持。原版 Hive JDBC 驱动的行为保持不变。
要使用 Apache Kyuubi 的 Kyuubi JDBC 驱动访问 Hive 数据仓库或新的 Lakehouse 格式(如 Apache Iceberg/Hudi、Delta Lake),你需要配置以下内容:
- 驱动库文件列表 - 引用 JDBC 驱动库。
- Driver 或 DataSource 类 - 注册驱动类。
- 驱动的连接 URL - 构建连接 URL
引用 JDBC 驱动库
在使用 Apache Kyuubi 的 JDBC 驱动之前,你用来连接数据的 JDBC 应用或 Java 代码必须能够访问驱动的 JAR 文件。
在 Java 代码中使用驱动
在代码中,根据你所使用的构建工具,从 Maven Central 指定构件 kyuubi-hive-jdbc-shaded。
Maven
<dependency>
<groupId>org.apache.kyuubi</groupId>
<artifactId>kyuubi-hive-jdbc-shaded</artifactId>
<version>1.9.1</version>
</dependency>sbt
libraryDependencies += "org.apache.kyuubi" % "kyuubi-hive-jdbc-shaded" % "1.9.1"Gradle
implementation group: 'org.apache.kyuubi', name: 'kyuubi-hive-jdbc-shaded', version: '1.9.1'在 JDBC 应用中使用驱动
关于 JDBC 应用(例如 BI 工具、SQL IDE),请查阅相应指南以获取详细信息。
注意
你心仪的工具没有收录?提交功能请求,或者帮助我们补充相关文档。
注册驱动类
在连接数据之前,必须先为你的应用注册 JDBC 驱动类。
- org.apache.kyuubi.jdbc.KyuubiHiveDriver
- org.apache.kyuubi.jdbc.KyuubiDriver(已废弃)
以下示例代码展示了如何使用 java.sql.DriverManager 类为 JDBC 建立连接:
private static Connection newKyuubiConnection() throws Exception {
Connection connection = DriverManager.getConnection(CONNECTION_URL);
return connection;
}构建连接 URL
基本连接 URL 格式
使用连接 URL 向您要访问的 kyuubi 服务器或集群提供连接信息。以下是 Kyuubi Hive JDBC 驱动的连接 URL 格式:
jdbc:subprotocol://host:port[/catalog]/[schema];<clientProperties;><[#|?]sessionProperties>- subprotocol:kyuubi 或 hive2
- host:Kyuubi 服务器的 DNS 名称或 IP 地址
- port:服务器用于监听客户端请求的 TCP 端口号
- catalog:可选的 catalog 名称,用于设置执行查询时所使用的当前 catalog。
- schema:可选的数据库名称,用于设置执行查询时所使用的当前数据库,缺省时使用默认值。
- clientProperties:可选的以分号(;)分隔的 key=value 参数,用于标识并影响客户端本地行为。例如:user=foo;password=bar。
- sessionProperties:可选的以分号(;)分隔的 key=value 参数,用于配置会话、操作或后台引擎。例如,kyuubi.engine.share.level=CONNECTION 表示后台引擎实例仅供当前连接使用;spark.ui.enabled=false 则禁用引擎的 Spark UI。
重要
- sessionProperties 必须位于前导的井号(#)或问号(?)之后。
- 属性名区分大小写
- 请勿在连接 URL 中重复定义属性
通过 HTTP 建立连接
1.6.0 版本新增。
jdbc:subprotocol://host:port/schema;transportMode=http;httpPath=<http_endpoint>- http_endpoint 是服务端通过 kyuubi.frontend.thrift.http.path 配置的对应 HTTP 端点。
通过服务发现建立连接 URL
jdbc:subprotocol://<zookeeper quorum>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=kyuubi- zookeeper quorum 是服务端由 kyuubi.ha.addresses 配置的对应 ZooKeeper 集群。
- zooKeeperNamespace 是服务端由 kyuubi.ha.namespace 配置的对应命名空间。
HiveServer2 兼容性
1.8.0 版本新增。
JDBC 驱动在连接时需要与 Kyuubi Server/HiveServer2 协商协议版本。
Kyuubi Hive JDBC Driver 默认向服务端提供协议版本 v10(clientProtocolVersion=9,自 Hive 2.3.0 起支持)。
如果需要连接 2.3.0 之前的 HiveServer2,请将客户端属性 clientProtocolVersion 设置为更小的数值。
jdbc:subprotocol://host:port[/catalog]/[schema];clientProtocolVersion=9;提示
所有受支持的协议版本及对应的 Hive 版本可以在 TProtocolVersion.java 及其 git 提交历史中找到。
Kerberos 认证
从 1.6.0 版本起,Kyuubi JDBC 驱动基于 JAAS 框架实现 Kerberos 认证,不再依赖 Hadoop UserGroupInformation,这意味着它不再强制依赖 Hadoop 依赖项来连接启用了 Kerberos 的 Kyuubi Server。
Kyuubi JDBC 驱动支持多种连接启用了 Kerberos 的 Kyuubi Server 的方式。首先,请按照 krb5.conf 说明 正确配置 krb5.conf。
通过 Principal 和 Keytab 进行认证
1.6.0 版本新增。
提示
这是进行 Kerberos 认证最简单的方式,对配置要求最低。
使用 principal 和 keytab 进行 Kerberos 认证非常直接,只需在 JDBC URL 中配置它们即可。
jdbc:kyuubi://host:port/schema;kyuubiClientPrincipal=<clientPrincipal>;kyuubiClientKeytab=<clientKeytab>;kyuubiServerPrincipal=<serverPrincipal>- kyuubiClientPrincipal:用于客户端认证的 Kerberos
principal - kyuubiClientKeytab:用于客户端认证的 Kerberos
keytab文件路径 - kyuubiClientTicketCache:用于客户端认证的 Kerberos
ticketCache文件路径,自 1.8.0 起可用。 - kyuubiServerPrincipal:服务端通过 kyuubi.kinit.principal 配置的 Kerberos
principal。自 1.7.0 起,principal可作为kyuubiServerPrincipal的别名使用,更早的版本请使用principal。
通过 Principal 和 TGT 缓存进行认证
Kybernos 认证的另一种典型用法是:先使用 kinit 生成 TGT 缓存,然后应用程序通过该 TGT 缓存完成 Kerberos 认证。
jdbc:kyuubi://host:port/schema;kyuubiServerPrincipal=<serverPrincipal>通过 Hadoop UserGroupInformation doAs 进行身份验证(仅限编程方式)
提示
这种方式可以让已经使用 Hadoop UserGroupInformation 进行 Kerberos 认证的项目轻松连接启用了 Kerberos 的 Kyuubi Server。该方式在 [1.6.0, 1.7.0) 区间内无法正常工作,已于 1.7.1 中修复。
String jdbcUrl = "jdbc:kyuubi://host:port/schema;kyuubiServerPrincipal=<serverPrincipal>"
UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytab(clientPrincipal, clientKeytab);
ugi.doAs((PrivilegedExceptionAction<String>) () -> {
Connection conn = DriverManager.getConnection(jdbcUrl);
...
});通过 Subject 认证(仅限编程方式)
String jdbcUrl = "jdbc:kyuubi://host:port/schema;kyuubiServerPrincipal=<serverPrincipal>;kerberosAuthType=fromSubject"
Subject kerberizedSubject = ...;
Subject.doAs(kerberizedSubject, (PrivilegedExceptionAction<String>) () -> {
Connection conn = DriverManager.getConnection(jdbcUrl);
...
});评论
登录后参与评论
KnowForge