現象
應用程序與HiveServer2建立了連接池,用戶在使用應用服務時,後端出現Broken pipe的異常堆棧:
[ERROR][2019-03-29T15:19:30.599+0800][AdhocHiveSQLHandler.java:57] _undef||traceid=645949405c9dc6ff1aca0f0905f64c02||spanid=081006710e526ddc||_msg=getHeader fails: {}
org.springframework.dao.DataAccessResourceFailureException: PreparedStatementCallback; SQL [select * from (SELECT 1) as bYqLqKBLre limit 0org.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe; nested exception is java.sql.SQLException: org.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:107)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1402)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:620)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:657)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:688)
產生原因
當向已經失效的連接中寫入數據時,操作系統會拋出Broken pipe錯誤。常見的連接失效的情況有以下幾種:
- 連接對端應用重啓或者掛掉;
- 網絡中斷;
經過與HIVE引擎確認,當時HIVE引擎在升級,而當前應用使用連接池時沒有配置有效性檢測的參數,導致出現問題;
參考: