首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >省级政务行业IT部门实时计算共享Flink集群JobManager内存故障排查实践总结

省级政务行业IT部门实时计算共享Flink集群JobManager内存故障排查实践总结

作者头像
用户9421738
发布2025-06-29 12:06:32
发布2025-06-29 12:06:32
1720
举报
文章被收录于专栏:大数据从业者大数据从业者

前言

省级政务中心IT统计管理实时计算资源,以共享Flink集群的方式提供给分管的下属地市。上线接近一年之久,客户反馈通过yarn-session模式启动的Flink集群JobManager出现故障:基于webui上传jar方式执行任务失败,堆栈提示内存溢出的异常(java.lang.OutOfMemoryError: Compressed class space)。本文从故障异常入手,基于JDK内存模型、排查JDK内存参数解决内存溢出的问题,最后总结常用的排查工具集,详见正文。笔者文章只发布微信公众号:大数据从业者

问题分析

完整异常日志如下:

代码语言:javascript
复制
Bad Request: "{"errors":["org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.
at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$handleRequest$1(JarRunHandler.java:110)
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:822)
at java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:797)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1595)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.CompletionException: java.lang.OutOfMemoryError: Compressed class space
图片
图片

Flink官方文档提供内存相关Troubleshooting,包括Java heap space、Direct buffer memory、Metaspace、Insufficient number of network buffers、Container Memory Exceeded等等。但是并没有上述CCS(Compressed class space)类型,可见这类异常可能并不常见,感兴趣的可以看下:

代码语言:javascript
复制
https://nightlies.apache.org/flink/flink-docs-release-2.0/docs/deployment/memory/mem_trouble/

客户尝试通过设置JDK参数-XX:CompressedClassSpaceSize增加相应内存,但是没有任何改善。通过实践示例操作检查确认如下:

启动yarn-session集群

代码语言:javascript
复制
./yarn-session.sh -Denv.java.opts.jobmanager="-XX:CompressedClassSpaceSize=512M" -d

查看JobManager进程JVM参数

代码语言:javascript
复制
jinfo  <pid>
图片
图片

从上图可以看到,Command line设置的参数值512M,实际并没有生效,还是默认的248M(260046848)。为什么设置不生效呢?这里参考看下JDK经典的内存模型结构图:

图片
图片

虽然说-XX:CompressedClassSpaceSize参数没问题,但是JVM开启指针压缩时(见上面jinfo结果图可以看到默认开启-XX:+UseCompressedOops),CompressedClassSpace内存属于MaxMetaspaceSize子集,即MaxMetaspaceSize=Compressed Class Space Size + Metaspace area (excluding the Compressed Class Space) Size。而默认的MaxMetaspaceSize为256M(见上面jinfo结果图-XX:MaxMetaspaceSize=268435456)。

那么,问题就清晰了,-XX:CompressedClassSpaceSize设置值不能超过-XX:MaxMetaspaceSize设置值。

解决方法

根据上述jinfo结果图,MaxMetaspaceSize=256M,默认动态分配给CompressedClassSpaceSize=248M。所以,有两种方式配置-XX:CompressedClassSpaceSize:

方法1:只增加MaxMetaspaceSize

代码语言:javascript
复制
./yarn-session.sh -Denv.java.opts.jobmanager="-XX:MaxMetaspaceSize=1G" -d
图片
图片

如上图所示,CompressedClassSpaceSize自动动态增加到1016M(1065353216)。

方法2:同时增加MaxMetaspaceSize和CompressedClassSpaceSize

代码语言:javascript
复制
./yarn-session.sh -Denv.java.opts.jobmanager="-XX:MaxMetaspaceSize=1G -XX:CompressedClassSpaceSize=512M" -d
图片
图片

如上图所示,CompressedClassSpaceSize已显示增加到512M(536870912)。

注意:从JDK源码来看,CompressedClassSpaceSize设置值限制为1M到3G之间。如图所示:

图片
图片

内存泄漏排查方法

内存OOM问题调大内存上限只是临时处理手段,还需要持续排查是否存在内存泄漏的隐患。针对本文遇到的Compressed class space内存溢出现象,可以通过如下工具继续排查内存是否泄漏:

方法1:Flink Metric

图片
图片

通过采集上述指标到Prometheus,可以持续观察类的记载和卸载情况,如图所示:

图片
图片
图片
图片

方法2:JMX Metric

与方法1 类似,采集JDK MBean参数ClassLoading信息,如图所示:

图片
图片

方法3:jcmdVM.classloader_stats

可以查看当前活跃的ClassLoader及对应的Class总数,如图所示:

图片
图片

方法4:jstat -gcmetacapacity1000

可以查看Compressed Class Space最大值、最小值、容量等信息,如图所示:

图片
图片
代码语言:javascript
复制
MC:Metaspace Capacity

CCSMN:Compressed Class Space Minimum

CCSMX:Compressed Class Space Maximum

CCSC:Compressed Class Space Capacity

方法5:日志打印

代码语言:javascript
复制
./yarn-session.sh -Denv.java.opts.jobmanager="-XX:+TraceClassLoading -XX:+TraceClassUnloading"

通过查看日志文件统计类加载与类卸载情况,如图所示:

图片
图片

方法6:jmap dump:format=b,file=heapdump.hprof

使用MAT分析heapdump.hprof文件,Leak Suspects Report初步查看泄露嫌疑。 Dominator Tree 搜索ClassLoader,按Retained Heap排序,关注较大实例:

图片
图片

通过Path to GC Roots检查GC Root引用链

图片
图片

总结

本文从故障异常入手,基于JDK内存模型、排查JDK内存参数解决内存溢出的问题,最后总结常用的排查工具集,详见正文。笔者文章只发布微信公众号:大数据从业者,其他均为转载

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据从业者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 问题分析
  • 解决方法
  • 内存泄漏排查方法
    • 方法1:Flink Metric
    • 方法2:JMX Metric
    • 方法3:jcmdVM.classloader_stats
    • 方法4:jstat -gcmetacapacity1000
    • 方法5:日志打印
    • 方法6:jmap dump:format=b,file=heapdump.hprof
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档