hive-jdbc版本:2.3.9
报错信息如下:
问题定位:客户端的socket连接读超时,默认超时时间为30秒,需要在应用端增大读超时时间。
解决方案:
1)hiveConnection在使用socket连接时,设置了超时时间为30秒,超时时间较短,在运行稍微复杂点的SQL时,就会导致超时。如下图。
2) hiveConnection的socket超时时间通过loginTimeout进行设置,而loginTimeout读取的DriverManager的超时时间,因此,在创建hive连接时需要设置DriverManage的loginTimeout属性。如下图。
3) hiveConnection通常使用数据库连接池进行创建和管理,系统使用的连接池为:Hikari。在数据库连接池创建时都会设置datasource的loginTimeout,并且会重置DriverManager的loginTimeout属性。如下图。
因此,需要使用connectionTimeout间接设置loginTimeout属性,如下。
config.setConnectionTimeout(1000 * 60 * 15);
总结:hive中执行SQL的耗时较长,需要增大网络读超时时间的值,如果使用Hikari数据库连接池管理hive连接,可以通过配置连接超时时间来改变hive的读超时时间。
另外:网上有很多解决方案,通过设置 DriverManager.setLoginTimeout() 增大hive读超时的时间。不能盲目跟随,需要结合各自应用进行配置。