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 处理记录的主要内容,如果未能解决你的问题,请参考以下文章

10-flink TaskManager 和 Slots

TaskManager 的 Flink 状态后端

Flink 中的 Taskmanager、Task、Slots、Parallelism、CPU 核是啥?

Flink 1.13 源码解析——TaskManager启动流程 之 初始化TaskExecutor

Flink FLink TaskManager with id is no longer reachable

FLink四种图 以及 数据在 taskManager 之间的流转