使用jdbc操作hive(impala)运行时报borken pipe错误

项目中需要使用hive来做查询,为了提高速度用了impala(jdbc地址没有变,驱动也还是hive,只是变了段口号)

项目是springboot + gradle + dbcp + spring data hadoop

项目中使用了spring新的HiveTemplate

项目运行一段时间后,查询会报出borken pipe,有时也会报连接重置,这个问题找了很久,困惑了很久

BasicDataSource bds = new BasicDataSource();
		bds.setDriverClassName("org.apache.hive.jdbc.HiveDriver");
		bds.setUrl("jdbc:hive2://localhost:10000/dw_api_server");
		bds.setMaxActive(10);
		bds.setMaxIdle(10);
		bds.setMinIdle(10);
		bds.setInitialSize(10);
		
		HiveClientFactoryBean hiveClientFactoryBean = new HiveClientFactoryBean();
		hiveClientFactoryBean.setHiveDataSource(bds);
	  hiveClientFactoryBean.afterPropertiesSet();
	  HiveClientFactory factory = hiveClientFactoryBean.getObject();
	  HiveTemplate hiveTemplate = new HiveTemplate(factory);

我是用上面的方法生成的HiveTemplate,由于需求原因,我们做查询的时候必须是原子操作,只能有一个用户查询,所以我使用的是单线程任务。项目在运行一段时间后,会报出断开管道错误。

排查中,首先排除驱动和版本问题,然后通过ss命令查看创建的tcp连接使用状态,发现永远用的都是一个连接地址(10个连接,永远只用固定一个),然后我在测试中打印出每次使用的connection的内存地址,果然是一根,怎么都不变,在这个基础上,由于我们远程的服务器并不是绝对稳定,有时会主动断开tcp连接,导致管道被中断,中断后使用ss命令查看客户端tcp连接状态,连接已经显示断开,但HiveTemplate还是继续拿同一根里连接,即使他已经断开,然后进行查询,就会报出Borken pipe。

        一开始想已经使用了连接池了,为什么连接池没有处理这个问题?

    最后先不用HiveTemplate了,直接从连接池getConnection,即使断开了,它会重新创建连接,不知道是不是HiveTemplate的bug,还是自己使用方法不对?

猜你喜欢

转载自blog.csdn.net/u011856283/article/details/80340364