各位大佬,请问flink1.13.6 cancel job 后为什么不释放内存呀?有人遇到过嘛?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Flink 1.13.6版本中,取消作业(Cancel Job)后内存未释放的问题可能与Flink的内存管理机制有关。以下是详细分析和解决方案:
Flink的Managed Memory是Flink自行管理的一块内存区域,其工作机制如下: - 在算子初始化时,Flink会预先申请好Managed Memory,并在运行过程中使用这些内存。 - 即使没有数据处理,只要算子被拉起,这部分内存就会被认为已分配,因此显示为100%使用。 - 内存的释放由Flink负责,触发释放的条件包括: - 内存使用完毕:当算子完成任务并释放内存。 - Task停止执行:当Task完全停止时,内存会被释放。
如果作业取消后内存未释放,可能是由于以下原因: - Task未完全退出,导致内存未被回收。 - 算子的close
方法或自定义函数中存在阻塞逻辑,导致Task无法正常退出。
根据知识库中的信息,以下情况可能导致内存未释放: 1. Task退出超时: - 默认情况下,Flink设置了一个Task退出的超时时间参数task.cancellation.timeout
,默认值为180秒。 - 如果作业在取消过程中因某种原因阻塞了Task的退出,Flink会在超时后判定该Task卡死,并主动停止TaskManager。 - 这种情况下,内存可能未被及时释放。
自定义函数实现问题:
close
方法中存在长时间阻塞逻辑,可能会导致Task无法正常退出,从而影响内存释放。Checkpoint或状态后端的影响:
针对上述问题,您可以尝试以下解决方法:
设置task.cancellation.timeout
参数为0,以避免Task退出超时:
task.cancellation.timeout: 0
重启作业后,观察是否仍有Task处于Cancelling
状态。如果有,可以通过查看Task的栈信息排查阻塞原因。
close
方法或计算逻辑,确保没有长时间阻塞的操作。如果使用了GeminiStateBackend,检查是否启用了懒加载和延迟剪裁功能:
state.backend.gemini.file.cache.download.type: LazyDownloadOnRestore
确保Checkpoint间隔设置合理,避免因Checkpoint间隔过大导致内存积压。
TRANSITIONING>CANCELLED
状态且无法正常释放资源,可以通过编辑作业的YAML文件强制删除:
com.dataartisans.appmanager.controller.deployment.sessionmode.force-cancellation: {{当前作业实例JobId}}
com.dataartisans.appmanager.controller.deployment.sessionmode.force-cancellation: 97229fcb-1df7-46dd-b4b3-b629f32f57fa
Flink 1.13.6取消作业后内存未释放的问题通常与Task退出超时、自定义函数阻塞或状态后端配置有关。通过调整task.cancellation.timeout
参数、优化自定义函数逻辑、检查状态后端配置以及强制删除作业,可以有效解决该问题。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。