FAQ-Task did not exit gracefully within 180 +

问题描述/异常栈

org.apache.flink.util.FlinkRuntimeException: Task did not exit gracefully within 180 + seconds.
    at org.apache.flink.runtime.taskmanager.Task$TaskCancelerWatchDog.run(Task.java:1709) [flink-dist_2.11-1.12-vvr-3.0.4-SNAPSHOT.jar:1.12-vvr-3.0.4-SNAPSHOT]
    at java.lang.Thread.run(Thread.java:834) [?:1.8.0_102]

发现版本

LTS 650

解决方案

注意:task.cancellation.timeout 参数仅用于作业调试,请不要在生产作业上配置该参数值为0。

可以设置Task退出的超时时间参数task.cancellation.timeout取值为0
配置为0时,Task退出阻塞将不会超时,该task会持续等待退出完成。
重启作业后再次发现作业在Failover或退出过程中长时间阻塞时,需要找到处于Cancelling状态的Task,查看该Task的栈,排查问题的根因,然后根据排查到的根因再针对性解决问题。

问题原因

该报错不是作业异常的根因。因为Task退出的超时task.cancellation.timeout参数的默认值为180s,当作业Failover或退出过程中,可能会因某种原因阻塞Task的退出。
当阻塞时间达到超时时间后,Flink会判定该Task已卡死无法恢复,会主动停止该Task所在的TaskManager,让Failover或退出流程继续下去,所以在日志中会出现这样的报错,需要结合任务完整日志具体分析。

作者:denglaixiang