Flink常見異常和錯誤信息小結

Flink的常見異常衆多,不可能面面俱到,所以想到哪兒寫到哪兒,有漏掉的之後再補充。
部署和資源問題

(0) JDK版本過低
這不是個顯式錯誤,但是JDK版本過低很有可能會導致Flink作業出現各種莫名其妙的問題,因此在生產環境中建議採用JDK 8的較高update(我們使用的是181)。

(1) Could not build the program from JAR file
該信息不甚準確,因爲絕大多數情況下都不是JAR包本身有毛病,而是在作業提交過程中出現異常退出了。因此需要查看本次提交產生的客戶端日誌(默認位於$FLINK_HOME/logs目錄下),再根據其中的信息定位並解決問題。

(2) ClassNotFoundException/NoSuchMethodError/IncompatibleClassChangeError/...
一般都是因爲用戶依賴第三方包的版本與Flink框架依賴的版本有衝突導致。

(3) Deployment took more than 60 seconds. Please check if the requested resources are available in the YARN cluster
就是字面意思,YARN集羣內沒有足夠的資源啓動Flink作業。檢查一下當前YARN集羣的狀態、正在運行的YARN App以及Flink作業所處的隊列,釋放一些資源或者加入新的資源。

(4) java.util.concurrent.TimeoutException: Slot allocation request timed out
slot分配請求超時,是因爲TaskManager申請資源時無法正常獲得,按照上一條的思路檢查即可。

(5) org.apache.flink.util.FlinkException: The assigned slot was removed
TaskManager的Container因爲使用資源超限被kill掉了。首先需要保證每個slot分配到的內存量足夠,特殊情況下可以手動配置SlotSharingGroup來減少單個slot中共享Task的數量。如果資源沒問題,那麼多半就是程序內部發生了內存泄露。建議仔細查看TaskManager日誌,並按處理JVM OOM問題的常規操作來排查。

(6) java.util.concurrent.TimeoutException: Heartbeat of TaskManager with id timed out
TaskManager心跳超時。有可能是TaskManager已經失敗,如果沒有失敗,那麼有可能是因爲網絡不好導致JobManager沒能收到心跳信號,或者TaskManager忙於GC,無法發送心跳信號。JobManager會重啓心跳超時的TaskManager,如果頻繁出現此異常,應該通過日誌進一步定位問題所在。

作業問題

(1)org.apache.flink.streaming.runtime.tasks.ExceptionInChainedOperatorException: Could not forward element to next operator
該異常幾乎都是由於程序業務邏輯有誤,或者數據流裏存在未處理好的髒數據導致的,繼續向下追溯異常棧一般就可以看到具體的出錯原因,比較常見的如POJO內有空字段,或者抽取事件時間的時間戳爲null等。

(2) java.lang.IllegalStateException: Buffer pool is destroyed || Memory manager has been shut down
很多童鞋拿着這兩條異常信息來求助,但實際上它們只是表示BufferPool、MemoryManager這些Flink運行時組件被銷燬,亦即作業已經失敗。具體的原因多種多樣,根據經驗,一般是上一條描述的情況居多(即Could not forward element to next operator錯誤會伴隨出現),其次是JDK版本問題。具體情況還是要根據TaskManager日誌具體分析。

(3) akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://...]] after [10000 ms]
Akka超時導致,一般有兩種原因:一是集羣負載比較大或者網絡比較擁塞,二是業務邏輯同步調用耗時的外部服務。如果負載或網絡問題無法徹底緩解,需考慮調大akka.ask.timeout參數的值(默認只有10秒);另外,調用外部服務時儘量異步操作(Async I/O)。

(4) java.io.IOException: Too many open files
這個異常我們應該都不陌生,首先檢查系統ulimit -n的文件描述符限制,再注意檢查程序內是否有資源(如各種連接池的連接)未及時釋放。值得注意的是,Flink使用RocksDB狀態後端也有可能會拋出這個異常,此時需修改flink-conf.yaml中的state.backend.rocksdb.files.open參數,如果不限制,可以改爲-1。

(5) org.apache.flink.api.common.function.InvalidTypesException: The generic type parameters of '' are missing
在Flink內使用Java Lambda表達式時,由於類型擦除造成的副作用,注意調用returns()方法指定被擦除的類型。

檢查點和狀態問題

(1) Received checkpoint barrier for checkpoint before completing current checkpoint . Skipping current checkpoint
在當前檢查點還未做完時,收到了更新的檢查點的barrier,表示當前檢查點不再需要而被取消掉,一般不需要特殊處理。

(2) Checkpoint expired before completing
首先應檢查CheckpointConfig.setCheckpointTimeout()方法設定的檢查點超時,如果設的太短,適當改長一點。另外就是考慮發生了反壓或數據傾斜,或者barrier對齊太慢。

(3) org.apache.flink.util.StateMigrationException: The new state serializer cannot be incompatible
我們知道Flink的狀態是按key組織並保存的,如果程序邏輯內改了keyBy()邏輯或者key的序列化邏輯,就會導致檢查點/保存點的數據無法正確恢復。所以如果必須要改key相關的東西,就棄用之前的狀態數據吧。

(4) org.apache.flink.util.StateMigrationException: The new serializer for a MapState requires state migration in order for the job to proceed. However, migration for MapState currently isn't supported

在1.9之前的Flink版本中,如果我們使用RocksDB狀態後端,並且更改了自用MapState的schema,恢復作業時會拋出此異常,表示不支持更改schema。這個問題已經在FLINK-11947解決,升級版本即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章