天天看點

記一次資料連接配接失敗問題Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 by

spark任務通路mysql,最近因為java異常導緻任務失敗。異常資訊如下,

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981)
        at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:628)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2255)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)

Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2957)
        at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560)
        ... 30 more
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
           

這個問題是沒隔幾天必定會出現,但是不是每天都出現。任務代碼是每天執行一次,也就是沒執行幾次就一定會出現連接配接失敗的問題,異常資訊如上。建立連接配接是在spark任務的java代碼中,且是在主節點上送出的。開始時猜測是資料庫連接配接建立太多了。是以我在主節點送出了一個任務,任務就是執行建立資料庫連接配接代碼,循環執行1000次。1000次跑完了任然沒有發現異常資訊。然後懷疑不是因為資料庫連接配接過多的問題。因為我們任務每天也就50條以内的連接配接,1天也不過500,況且用完了還會釋放。是以應該不是連接配接過多的緣故。

然後猜測是網絡帶寬的問題,帶寬被用完了。然後模拟場景,本機開啟多線程任務不斷去連接配接主節點的資料庫(連接配接之後不會close),然後發現本機會出現上述異常,且異常大都是在帶寬飙到20M/s左右發生。當本機有異常的時候,主節點跑的連接配接資料庫任務(連接配接之後不會close)也會列印出異常資訊。至此問題複現

我再此得出的結論是資料庫連接配接也要保證網絡暢通的情況,帶寬不足怎麼樣都會出現連接配接不上的情況的

繼續閱讀