文章目录

  • 现象
  • 背景知识
  • MetaSpace分析
    • 微服务
    • 计算场景
  • 代码分析
    • 步骤1
    • 步骤2
    • 步骤3
    • 步骤4
    • 步骤5
  • 总结
    • 其它

现象

flink 程序打成jar多次提交后,有taskmanager 节点挂掉,这个现象而且经过多次试验后发现是必现,日志如下

The metaspace out-of-memory error has occurred.
This can mean two things: either Flink Master requires jobmanager.memory.jvm-metaspace.size a larger size of JVM metaspace to load classes or there is a class loading leak. In the first case jobmanager.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 Flink Master has to be shutdown

背景知识

flink里面加载器,分为 ParentFirstClassLoader ChildFirstClassLoader ,ChildFirstClassLoader是默认的类加载器

MetaSpace分析

从报错日志分析来看,一种是metaspace 真的非常小,另外的原因就是代码中存在内存泄漏,class 没有被回收,很明显问题应该在内存泄漏,metaspace这个问题应该还是出现的很少的。

微服务

通常的微服务通常启动过,就不会有新加载类的情况,所以很少出现此类问题,有些场景比如,部分用到反射的场景,可能会有这个问题

计算场景

计算平台每收到一个新的job,就要加载用户类,所以如果用户程序或者第三方jar有内存泄漏的情况就会导致task 节点的metaspace 一直增加,直到OOM

代码分析

代码逻辑
消费kafka--------->计算-------------->写es/kafka

写ES 用到的ES类

public RestHighLevelClient restHighLevelClient;

步骤1

先简单修改下代码测试下

  1. 消费kafka--------->输出 重试N次,没有问题
  2. 消费kafka--------->计算----->输出 重试N次,没有问题
  3. 消费kafka--------->计算----->写es 问题复现
  4. 消费kafka--------->计算----->写kafka 重试N次,没有问题

经过上面的尝试
问题的方向应该在写es上

步骤2

查阅相关的资料

  1. 有没有任务里面有线程没有被关闭,这些线程可能还持有class 对象的引用
  2. 缓存相关的东西
  3. JDBC 相关的类,放在lib 目录下,这样只加载一次
  4. RuntimeContext.registerUserCodeClassLoaderReleaseHookIfAbsent() 注册一个钩子函数,手动释放掉类加载器

flink 调试类加载

步骤3

用MAT 工具分析
确实有很多类重复,每次提交相同的job,类就是会被加载,在测试的时候,用 jvisualvm 打开可以直观看到加载类的变化,也可以执行GC,这里要注意的是,一下要在多次GC之后,再dump,这样剩下的类才是没有办法卸载的

查看leak suspects

这里注意这个红色的,和ES相关,引起了我的注意

分别得到从这个对象到GC root的路径

GC root 到这个对象的最短路径

黄点表示GC ROOT
path to GC roots
merge shortest paths to GC roots
这两个的区别可以从图标上看出来

步骤4

从上面的分析再思考下,RestHighLevelClient关联的对象大小排第一,这个类应该在任务结束之后会被回收才对,为什么没有被回收呢?看下代码
RestHighLevelClient 对象确实有close方法,但是没有执行
修改下代码,重试下看看

 @Overridepublic void close() throws Exception {super.close();RestHighLevelClient restHighLevelClient = esUtil.getRestHighLevelClient();restHighLevelClient.close();}

步骤5

问题解决,提交N次任务,没有发生OOM 异常,多次提交任务后,taskmanager的metaspace 虽然会增加,但是触发full gc之后,类能够被卸载,metaspace 会减小

总结

虽然最后从文章来看,解决的比较容易,中间其实也看了很多的资料,最开始用MAT工具没有看出结果,下面是从这次问题可以收获的几个知识点

  1. 类卸载的时机
  2. classloader 卸载时机
  3. MAT 工具的使用
  4. jvisualvm 使用
  5. flink 类加载机制
  6. jvm 内存结构
  7. 解决问题的思路,比如可以不段缩小代码执行的范围

其它

之前这个问题一直都存在,一直没有解决,这次小长假的计划就是解决这个问题,最后的结果是完美的。

flink taskmanager metaspace OOM相关推荐

  1. Flink TaskManager OutOfMemoryError: Metaspace 处理记录

    一个很有意思的Flink任务异常处理记录 一.环境信息 Flink1.12 Standalone 模式,单台机器,由于客户环境基本很长时间会看不到运行状态 二.问题现象 现场同事反馈设备在客户现场运行 ...

  2. 聊聊flink TaskManager的managed memory

    序 本文主要研究一下flink TaskManager的managed memory TaskManagerOptions flink-core-1.7.2-sources.jar!/org/apac ...

  3. 记一次由Arthas引起的Metaspace OOM问题

    如无特殊说明,本文默认基于以下环境叙述: JDK: OpenJDK 14GA macOS 10.15 Arthas 3.3.9 VisualVM 2.0.2 从Arthas 3.4.2开始,此问题已经 ...

  4. Flink批处理metaspace内存溢出问题

    问题 早上过来发现定时任务出现告警,Flink Jobs运行失败,登录Flinkweb后台一看,所有jobs都没了,slot也为0. 查看Flink日志,有以下错误异常: 2022-12-07 08: ...

  5. 我出题,你来算。根据Flink TaskManager内存模型,各部分内存分配?

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 大数据面试提升私教训练营 Hi,我是王知无,一个大数据领域的原创作者. 放心关注我,获取更多行业的 ...

  6. flink taskmanager参数优化

    taskmanager.memory.network.exclusive-buffers-request-timeout-ms=600000; taskmanager.memory.network.m ...

  7. 【Flink-未解决】 FLink TaskManager with id is no longer reachable

    文章目录 1.场景1 1.1概述 1.场景1 1.1概述 flink报错如下 org.apache.flink.runtime.jobmaster.JobMasterException: TaskMa ...

  8. Flink taskmanager因节点宕机失效或进程异常导致的报警处理

    flink的taskmanager的端口占用情况是动态分配的,因此在promethues的监控targets配置也采用了脚本动态拉取更新: 1. 先连接zookeeper,查看flinkNodes的注 ...

  9. 【Flink】Flink TaskManager 一直 User file cache uses directory

    文章目录 1.概述 1.概述 taskmanager日志一直是这个,是我资源给我的不够么 对应的代码如下,可以看到窗口FileCache的 时候,循环窗帘临时目录,这里走了if,所以仅仅是打了Info ...

最新文章

  1. Redis 缓存使用技巧和设计方案
  2. 用python画月亮的代码-用 Python 画一个超级月亮
  3. 【Netty】NIO 缓冲区 ( Buffer ) 组件
  4. 内功重修之数据结构----数组
  5. 用代码创建工程并添加内容
  6. 读书笔记_CLR.via.c#第五章_基元类型_引用类型_值类型
  7. 使用cdev_add注册字符设备
  8. markdown单元格快速合并(不用自己写html代码)
  9. php查找txt文件是否有,php怎么查询txt文件是否存在
  10. 阿里大佬手把手教你用jmeter做压力测试(详图)
  11. 运用C语言文件编写自动评分系统,C语言程序题自动评分系统的研究与实现
  12. 微信开发,微信开发者平台
  13. 文件操作(第二节文件的写入和读取)
  14. OBS第三方推流直播教程
  15. Django教程 —— Django入门
  16. 传奇单机架设超详细图文教程
  17. 邦纳超声波传感器T30UXDA
  18. 一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(上)
  19. 华为云 承诺重于泰山!
  20. iOS13升级后的第一感觉:旧版iPhone重生,并向您提供了20个隐藏功能!

热门文章

  1. BraTS2021 + nnU-Net配置
  2. call方法 java_webservice接口call调用方式
  3. 视频质量诊断----雪花噪声检测
  4. 磐云网络空间安全环境制作iso镜像转img格式导入。
  5. 2019年二建水利答案1
  6. 对于电影我不是药神我有话要说
  7. 为女朋友写一个小程序(一)— —目的与需求
  8. c# jarray 快速提取_C# JArray与JObject 的使用
  9. python 浮点数出现长串0 错误位数
  10. 夜天之书 #41 共同创造价值