hive-jdbc的connection如何设置socketTi
2022-11-14 本文已影响0人
小胖学编程
每日的数据同步任务中,会将在线业务库的数据同步至 Hive,在刚上线的一段时间内,对 Hive 的 SQL 操作每隔十来天会出现 socket read timeout 的异常。该问题导致我经常凌晨收到告警然后起床修复该问题,因为该问题是偶现,不便复现,经过查阅 Hive JDBC 的源码,定位问题为 Hive JDBC 使用了 java.sql.DriverManager 中的静态变量 loginTimeout 的值,而我们的工程中接入了八九种类型的 JDBC 驱动,部分类型还使用了连接池,先看看 java.sql.DriverManager 中的部分源码:
依赖版本
版本:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.3.2</version>
</dependency>
源码分析
- 获取到connection代码:
HiveDriver client = new HiveDriver();
connection = client.connect(URL + HUE_PARAM, prop);
- client.connect源码:
初始化hive connection时,将loginTimeout时间赋予了HiveConnection
对象的loginTimeout
。
- loginTimeout时间最终会赋予给socket对象的socketTimeOut时间。
解决方案
不升级版本方案:
HiveDriver client = new HiveDriver();
DriverManager.setLoginTimeout(500);
connection = client.connect(URL + HUE_PARAM, prop);
升级版本方案:
官方已经于 2021 年 2 月 17 日被修复并合并至 master 分支,详情可查看该 PR: HIVE-12371 Adding a timeout connection parameter for JDBC #1611。
可以升级到及其后续版本:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.3</version>
</dependency>