各位大佬,请问flink1.13.6 cancel job 后为什么不释放内存呀?有人遇到过嘛?

各位大佬,请问flink1.13.6 cancel job 后为什么不释放内存呀?有人遇到过嘛?

展开
收起
真的很搞笑 2023-06-18 12:33:29 125 分享 版权
阿里云 AI 助理回答

在Flink 1.13.6版本中,取消作业(Cancel Job)后内存未释放的问题可能与Flink的内存管理机制有关。以下是详细分析和解决方案:


1. Flink Managed Memory的工作机制

Flink的Managed Memory是Flink自行管理的一块内存区域,其工作机制如下: - 在算子初始化时,Flink会预先申请好Managed Memory,并在运行过程中使用这些内存。 - 即使没有数据处理,只要算子被拉起,这部分内存就会被认为已分配,因此显示为100%使用。 - 内存的释放由Flink负责,触发释放的条件包括: - 内存使用完毕:当算子完成任务并释放内存。 - Task停止执行:当Task完全停止时,内存会被释放。

如果作业取消后内存未释放,可能是由于以下原因: - Task未完全退出,导致内存未被回收。 - 算子的close方法或自定义函数中存在阻塞逻辑,导致Task无法正常退出。


2. 可能的原因分析

根据知识库中的信息,以下情况可能导致内存未释放: 1. Task退出超时: - 默认情况下,Flink设置了一个Task退出的超时时间参数task.cancellation.timeout,默认值为180秒。 - 如果作业在取消过程中因某种原因阻塞了Task的退出,Flink会在超时后判定该Task卡死,并主动停止TaskManager。 - 这种情况下,内存可能未被及时释放。

  1. 自定义函数实现问题

    • 如果您在作业中使用了自定义函数(如UDF),且close方法中存在长时间阻塞逻辑,可能会导致Task无法正常退出,从而影响内存释放。
  2. Checkpoint或状态后端的影响

    • 如果作业使用了GeminiStateBackend或其他状态后端,可能存在状态恢复或清理的延迟,导致内存未及时释放。

3. 解决方案

针对上述问题,您可以尝试以下解决方法:

3.1 检查Task退出超时

  • 设置task.cancellation.timeout参数为0,以避免Task退出超时:

    task.cancellation.timeout: 0
    
    • 配置方法请参考如何配置自定义的作业运行参数。
    • 注意:此参数仅用于调试,请勿在生产环境中长期使用。
  • 重启作业后,观察是否仍有Task处于Cancelling状态。如果有,可以通过查看Task的栈信息排查阻塞原因。

3.2 检查自定义函数实现

  • 检查自定义函数的close方法或计算逻辑,确保没有长时间阻塞的操作。
  • 如果发现问题,优化代码逻辑,确保Task能够正常退出。

3.3 检查状态后端配置

  • 如果使用了GeminiStateBackend,检查是否启用了懒加载和延迟剪裁功能:

    state.backend.gemini.file.cache.download.type: LazyDownloadOnRestore
    
    • 此配置可以减少状态恢复时的内存占用。
  • 确保Checkpoint间隔设置合理,避免因Checkpoint间隔过大导致内存积压。

3.4 强制删除作业

  • 如果作业处于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
    
    • 重新上线作业以完成强制删除。

4. 其他建议

  • 监控内存使用:通过Flink Web UI或日志监控TaskManager的内存使用情况,确认是否存在内存泄漏或异常占用。
  • 升级Flink版本:Flink 1.13.6是一个较旧的版本,建议升级到更高版本(如1.15或1.16),以获得更好的内存管理和性能优化。

总结

Flink 1.13.6取消作业后内存未释放的问题通常与Task退出超时、自定义函数阻塞或状态后端配置有关。通过调整task.cancellation.timeout参数、优化自定义函数逻辑、检查状态后端配置以及强制删除作业,可以有效解决该问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

还有其他疑问?
咨询AI助理