Flink TaskManager OutOfMemoryError: Metaspace 处理记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink TaskManager OutOfMemoryError: Metaspace 处理记录相关的知识,希望对你有一定的参考价值。
一个很有意思的Flink任务异常处理记录
一、环境信息
Flink1.12 Standalone 模式,单台机器,由于客户环境基本很长时间会看不到运行状态
二、问题现象
现场同事反馈设备在客户现场运行了一段时间后Flink Job全挂,在Flink DashBoard上所有的Job都看不到了,TaskManager已经挂掉了,但TaskManager进程还在, 手动重启taskmanager服务后恢复正常
三、问题排查
系统监控上,磁盘IO,CPU,内存使用都正常,/var/log/message中也没看到异常信息
发现Flink taskmanager的日志有OutOfMemoryError: Metaspace情况
四、原因分析
五、第一次内部复现
任务重启情况
TaskManager已经挂掉,但是进程还在(处于假死状态)
此时Flink调度系统在一直重试拉起任务但是一直失败,Taskmanager的日志没有出现OutOfMemoryError的情况
六、第二次复现-成功复现 MetaSpace OutOfMemoryError
单次重复慢速(每60s提交一次)提交瞬间错误的任务,长时间失败提交后,在Taskmanager中出现MetaSpace OutOfMemoryError的信息
复现的TaskManager out-of-memory错误日志
并且能在systemd中查看到flink-taskmanager重启的信息
但是此时查看flink dashboard界面,能看到所有任务提示Running正常,无问题(但其实不能工作)
切换到单个任务内部,在overview上也能看到是正常的标识
但是在exception中,则能看到提示没有slot的信息,无法提交任务
七、第三次内部复现- 说明有一定概率自动恢复
操作步骤和第二步一样,但是Taskmanager会过段时间挂掉自动恢复(通过systemd),调度系统重试提交任务几次后,成功提交,任务恢复正常
八、问题解决
当然还是要优先处理掉程序中的bug,解决任务重启问题, 但为防止后续有其他问题,看到网上有以下几个方案: 1,JAR包依赖分离, 把用到的第三方包放到flink/lib目录下 2,更改运行方式为Local或者Yarn模式(这种内存泄漏在Standalone-cluster模式才会出现)
附上官网关于这个问题的说明
https://nightlies.apache.org/flink/flink-docs-master/docs/ops/debugging/debugging_classloading/#unloading-of-dynamically-loaded-classes-in-user-code
官网原版可能看的更清楚些
官网翻译
以上是关于Flink TaskManager OutOfMemoryError: Metaspace 处理记录的主要内容,如果未能解决你的问题,请参考以下文章
Flink 中的 Taskmanager、Task、Slots、Parallelism、CPU 核是啥?
Flink 1.13 源码解析——TaskManager启动流程 之 初始化TaskExecutor