Flink集群元空间内存溢出报错处理 java.lang.OutOfMemoryError: Metaspace
一、环境以及背景故事说明
Flink standalone 分布式集群
Version: 1.13.1
在某天平淡的工作中发现flink集群的其中一个节点竟然挂掉了,于是便从日志中查找报错信息;通过报错信息了解到,是因为我们的taskmanager的元空间内存不够了
二、详细报错情况
具体报错情况
ERROR org.apache.flink.runtime.taskexecutor.TaskManagerRunner
[] - Fatal error occurred while executing the TaskManager. Shutting it down...
java.lang.OutOfMemoryError: Metaspace. The metaspace out-of-memory error has occurred.
This can mean two things: either the job requires a larger size of JVM metaspace to load classes or there is a class loading leak.
In the first case 'taskmanager.memory.jvm-metaspace.size' configuration option should be increased.
If the error persists (usually in cluster after several job (re-)submissions) then there
is probably a class loading leak in user code or some of its dependencies which has to be investigated and fixed.
The task executor has to be shutdown...
emmm…… 百度翻译一下
我们通过报错信息得知,我们可以选择增加元空间内存来解决该报错,并且告诉我们应增加taskmanager.memory.jvm-metaspace.size 配置来实现。实在是太贴心了!
三、解决办法
在Apache Flink官网查看一下 taskmanager.memory.jvm-metaspace.size 描述
该配置默认为256MB,我们也可以通过flink web界面来查看对应节点对应内存大小以及使用情况,然后结合我们服务器配置以及任务量来分析我们应该配置多少内存合适。
其中要先注意在配置文件中有一个 taskmanager.memory.process.size 参数,该参数是taskmanager总内存数,也就是 taskmanager.memory.process.size 包含 taskmanager.memory.jvm-metaspace.size
这个我们下面内存分析中再讨论
然后我们进入到对应目录下,通过该参数增加对应内存。
# 进入到该目录下
cd /flink/conf
#修改该配置文件
vim flink-conf.yaml
# 假如设置为500MB
taskmanager.memory.jvm-metaspace.size: 500m
当我们修改完配置后,要注意是否需要同步到其它节点,以及需要重启flink集群后才能生效!
如果是生产环境的话,一定要慎重。
四、内存模型分析
在flink-conf.yaml配置文件中,Task Manager的内存模型,分为5大部分:堆内存、堆外内存、直接内存、MetaSpace内存以及JVM Overhead内存。
简单的来说taskmanager.memory.process.size的值=JVM Heap+Off-Heap Memory+Direct Memory+JVM Metaspace +JVM Overhead
其中当我们增加taskmanager.memory.process.size时,Task Heap、Managed Memory、Network也会自动随之增加。
但JVM Metaspace需要我们自己通过参数来配置大小
五、最后
如有说的不对的地方还望大家指正。祝大家天天进步,变得更强!