最近完成一个业务需求,flink程序上线之后,跑了不到一分钟就挂了,查看日志,报错如下:
org.apache.flink.util.FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold.
at org.apache.flink.runtime....

明显,checkpoint超时了,于是,我下意识地去检查checkpoint的设置,
代码中的设置如下:
// 每 ** ms 开始一次 checkpoint
env.enableCheckpointing(10*1000);
// 设置模式为精确一次 (这是默认值)
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.AT_LEAST_ONCE);
// 确认 checkpoints 之间的时间会进行 ** ms
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
// Checkpoint 必须在一分钟内完成,否则就会被抛弃
env.getCheckpointConfig().setCheckpointTimeout(60000);
// 同一时间只允许一个 checkpoint 进行
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
// 开启在 job 中止后仍然保留的 externalized checkpoints
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// 允许在有更近 savepoint 时回退到 checkpoint
env.getCheckpointConfig().setPreferCheckpointForRecovery(true);
尝试更改一下timeout时间,从1分钟改为10分钟,重新打包上线。
然后查看UI界面,发现checkpoint仍然无法正常进行,状态一直是IN_PROGRESS,没有进展,只不过从等待1分钟变成了10分钟,程序最后还是挂掉

这个时候,考虑不是checkpoint设置问题,而是程序有bug,资源没有释放或者其他问题,导致程序卡住了,以至于checkpoint超时。
仔细检查etl逻辑,发现忘了关闭数据库连接。
//关闭连接和释放资源
if (connection != null) {
connection.close();
}
if (ps != null) {
ps.close();
}
在本地测试的时候,由于测试数据的并发量不够,数据库没有被打满,所有没有出现任务卡住了;上了预生产环境后的大量数据涌入,才导致问题出现,本地调试发现不了这个问题。
修改代码重新上线,查看checkpoint界面,正常执行。

在部署Flink程序后,遇到一分钟后任务挂起的问题,检查日志显示checkpoint超时。首先调整checkpoint超时时间,但问题依旧,checkpoint状态持续为IN_PROGRESS。进一步排查发现是由于忘记关闭数据库连接,导致资源占用,任务卡住。在预生产环境中,大量数据触发了该问题。修复代码并重新上线后,checkpoint恢复正常。
2484

被折叠的 条评论
为什么被折叠?



