一、背景
在Flink開發中,上線的任務經常會無故掛掉,剛開始對任務無故掛掉的原因,一無所知,排查起來也比較困難,網上資料也比較模糊不清,后面通過查閱資料和自己的一些經驗,總算是有了一些結果,所以想總結一下近段時間所遇到的問題和解決方法。
二、問題陳列
1.Flink On YARN中任務掛掉后,YARN的Web UI顯示還在運行,但實際上已經掛掉了
原因:這是由於Flink提交給YARN之后,YARN后續並沒有繼續監控Flink任務的狀態
解決辦法:在提交任務時,命令行加一個參數 -d 即可,例如:run -m yarn-cluster -d -p 2 -yn 2 -yjm 1024m -ytm 2048m -ynm xxxx -c xxxx
2.java.lang.Exception: Container released on a *lost* node
原因:YARN隊列壓力過大或者磁盤滿了之后,可能會導致Flink申請的節點標記為失敗,導致taskmanager掛掉
解決辦法:如果有配置重啟策略的話,taskmanager會進行重啟,如果沒有配置重啟策略但是配置了checkpoint,默認的重啟策略是無限次重啟,但是需要注意一點的是,taskmananger成功重啟的前提是jobmanager沒有掛掉,如果jobmanager也掛掉了,那么taskmanager重啟成功之后也是無效的。
3.生產上的任務頻繁掛掉,一開始以為是問題二導致的,但是實際上問題二配置了checkpoint或者重啟策略之后會自己重啟,所以證明主要原因並不是以上的問題,其實主要的原因就是當YARN的隊列資源緊張的時候,也有可能導致jobmanager掛掉,我們生產上的集群並沒有配置Flink On YARN的高可用,即jobmanager掛掉之后是不會進行重啟的,所以需要配置Flink On YARN的高可用,配置如下(此配置適用於Flink On YARN的yarn-cluster模式):
1)首先配置 yarn-site.xml,配置resourcemanager重啟次數
<property> <name>yarn.resourcemanager.am.max-attempts</name> <value>4</value> <description> The maximum number of application master execution attempts. </description> </property>
2)配置flink-conf.yaml ,這里必須添加zookeeper 信息,官方文檔yarn-cluster模式只要求添加重啟參數,不添加的話,task manager 會和job manager 一起掛掉, 只會重啟對應的job manager
# flink job manager次數 這個參數必須小於yarn.resourcemanager.am.max-attempts
yarn.application-attempts: 3
# 添加zookeeper 配置
high-availability: zookeeper
high-availability.zookeeper.quorum: xx.x.x.xxx:2181
# job manager元數據在文件系統儲存的位置
high-availability.storageDir: hdfs:///flink/recovery
三、測試
1.啟動flink 程序
2. kill 掉對應的 YarnSessionClusterEntrypoint (對應job manager)所在進程
3.新的job manager,已經被重啟,恰巧也和task Manager一個一個節點
4.task manager 上對應日志如上,與舊的job manager 的ResourceManager通信,當超時大於10s后,將其標記為失敗,之后根據zookeeper去注冊到新的job manager
注:此配置只能降低Flink的失敗次數,如果想讓Flink穩定運行,應該還是需要在YARN上單獨划分一個隊列給實時任務使用,避免因其他因素導致實時任務失敗
參考文檔:https://blog.csdn.net/yumingzhu1/article/details/118994625