hive-jdbc的connection如何设置socketTimeOut

每日的数据同步任务中,会将在线业务库的数据同步至 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>

源码分析

  1. 获取到connection代码:
HiveDriver client = new HiveDriver();
connection = client.connect(URL + HUE_PARAM, prop);
  1. client.connect源码:

初始化hive connection时,将loginTimeout时间赋予了HiveConnection对象的loginTimeout

image.png

image.png
  1. loginTimeout时间最终会赋予给socket对象的socketTimeOut时间。
image.png

解决方案

不升级版本方案:

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>

文章参考

关于 Hive JDBC 的超时问题

推荐阅读更多精彩内容