Flink多次运行作业后TaskExecutor关闭,如何清理或重启TaskManager?
Flink TaskManager堆内存未释放导致TaskExecutor异常的处理方案
一、手动清理/重启TaskManager的操作步骤
1. 单节点异常应急恢复
- 停止异常节点的TaskManager进程:
ps -ef | grep TaskManager | grep -v grep | awk '{print $2}' | xargs kill -9 - 清理残留临时文件和缓存:删除Flink工作目录下对应TaskManager的tmp文件夹,默认路径为
${FLINK_HOME}/tmp/taskmanager-* - 重新启动TaskManager:
${FLINK_HOME}/bin/taskmanager.sh start - 集群模式下重启后TaskManager会自动向ResourceManager注册,不需要额外操作,之前失败的作业会按配置的重启策略自动恢复
2. 集群级批量重启(适用于多个TaskManager同时出现内存泄漏的场景)
- 先为所有运行中的作业创建保存点:
flink savepoint <jobId> <savepoint-path> - 停止整个Flink集群:
${FLINK_HOME}/bin/stop-cluster.sh - 清理所有节点的TaskManager缓存和历史日志:
rm -rf ${FLINK_HOME}/log/* ${FLINK_HOME}/tmp/* - 重新启动集群:
${FLINK_HOME}/bin/start-cluster.sh - 从保存点恢复作业运行:
flink run -s <savepoint-path> <job-jar-path>
二、根源性避免内存不自动释放的优化方案
多次作业运行后堆内存不释放本质是用户代码内存泄漏或Flink配置不合理导致,可通过以下配置避免问题重复触发:
- 开启TaskManager空闲自动回收:配置
taskmanager.shutdown-on-idle: true,当TaskManager空闲超过指定时间后会自动关闭,后续有新作业提交时ResourceManager会自动拉起新的TaskManager进程,从根本上避免旧进程堆内存累积 - 配置OOM自动退出机制:设置
taskmanager.jvm-exit-on-oom: true,一旦出现内存溢出异常会自动退出TaskManager进程,集群会自动拉起新的实例,避免异常进程持续影响作业运行 - 限制单TaskManager的插槽数:配置
taskmanager.numberOfTaskSlots为合理数值,避免单进程承载过多作业导致内存碎片累积 - 开启托管内存管理:如果使用RocksDB状态后端,配置
state.backend.rocksdb.memory.managed: true,让Flink统一管理状态内存,作业结束后自动释放相关内存块
稳定性要求高的场景优先使用Per-Job或者Application模式运行作业,作业结束后会自动销毁对应的TaskManager集群,不会存在内存累积的问题;Session集群建议定期重启TaskManager节点释放内存碎片。
内容的提问来源于stack exchange,提问作者Can DALAY
相关产品推荐
相关产品推荐

