背景
最近flink的在線應用出現錯誤java.lang.IllegalStateException: Buffer pool is destroyed,本文記錄下這個錯誤的原因
錯誤原因
詳細的日志堆棧如下:
Caused by: java.lang.IllegalStateException: Buffer pool is destroyed.
at org.apache.flink.runtime.io.network.buffer.LocalBufferPool.requestMemorySegment(LocalBufferPool.java:337)
at org.apache.flink.runtime.io.network.buffer.LocalBufferPool.requestBufferBuilder(LocalBufferPool.java:279)
首先這個錯誤是TaskManager拋出的,Buffer pool是用于網絡通知的緩存區,當TaskManager向下游發送網絡數據時,會首先從Buffer pool申請內存用于存放要發送的數據,而當Netty框架收到上游TaskManager發送的網絡數據時,也是先從Buffer pool中申請內存用于存放接收到的網絡數據,意思就是說TaskManager網絡通信時都需要用到Buffer pool,那么什么情況下Buffer pool is destroyed,也就是網絡環境被關閉呢?絕大部分原因是因為TaskManager crash down,也就是TaskManager宕機了或者是TaskManager restart前在關閉的過程中的報錯. 所以收到這個錯誤我們應該去順著查找TaskManager容器的錯誤,例如發生了作業失敗導致的restart之類的錯誤