flink jobmanager离奇的heap oom

文章目录

      • 现象描述
      • 开始分析
        • 1.初步分析dump文件
        • 2.AI分析引用关系
          • 分析方向2.1 flink BlobServer bug
          • 分析方向2.2 和运行环境有关
          • 分析方向2.3 和任务有关
      • 回到问题本身,思考一下
          • 1. seatunnel到底有没有问题
          • 2.再次分析zipfile对象
          • 3.分析seatunnel es connector 源码
          • 4 怀疑EsRestClient(seatunnel里的对象) 对象没有被close
          • 5 怀疑es 自带的RestClient 有问题
          • 6 继续观察RestClient
          • 7 观察有没有CloseableHttpAsyncClient 和这相关的file bug
      • 总结

现象描述

使用seatunnel 同步es数据到clickhouse,多次提交批任务后,flink jobmanager 报heap oom
jobmanager 是session 模式,jobmanager 会常驻,不是第一次使用seatunnel同步数据

开始分析

1.初步分析dump文件

通过MAT工具把dump 文件打开,发现,提示和zipfile文件相关,zipfile 确实有很多对象,没有被回收,最终导致heap 内存使用完,报oom

在这里插入图片描述

2.AI分析引用关系

把上面的信息交给deepseek后得到结论

问题现象: 383 个 ZipFile$Source 实例占用 1.1GB 内存(72.52%)。

这些实例被 HashMap$Node[] 引用,根源为 Flink 的 BlobServer。

根本原因: BlobServer 的 BLOB 缓存泄漏 Flink 的 BlobServer 负责管理用户上传的二进制对象(如 JAR
文件、配置文件)。如果 BLOB 未被及时清理(如临时文件未删除或缓存未释放),会导致 ZipFile$Source 实例(关联已打开的
ZIP 文件句柄)堆积,占用大量内存。

资源未正确关闭 在读取 ZIP 文件时未正确关闭 ZipFile 或 InputStream,导致文件句柄和内存无法释放

分析方向2.1 flink BlobServer bug

由deepseek得出来的结论指向flink 的BlobServer
首先我找了BlobServer 所有的提交历史记录,没有找到和这个有关的提交,一度我怀疑是这个变量里的内容没有被定时任务清除导致,因为这个变量是在thread里的,通过arthas 也不好实时分析,于是我下载了源码,加上日志,重新编译,生成jar 包,重新运行观察。发现这里运行是正常的。
我把同样的dump内容交给qwen 和chatgpt 都指向这里,于是我只有向社区提交了jira ,看看有没有人遇到过这个问题,搞完上面这些,3天时间已经过去,没找到明确的方向

private final ConcurrentHashMap<Tuple2<JobID, TransientBlobKey>, Long> blobExpiryTimes =new ConcurrentHashMap<>();
分析方向2.2 和运行环境有关

于是我把相同的任务换到一个没有这个问题的环境里,多次测试任务后,问题复现,看来和环境没有关系

分析方向2.3 和任务有关

任务读es还要写clickhouse ,于是我把任务sink修改成console,多次测试后,问题复现,看来和任务本身没有关系

回到问题本身,思考一下

为啥之前使用seatunnel没有问题
为啥问题发生在jobmanager
为啥会有这么多zipfile 对象

1. seatunnel到底有没有问题

鉴于之前使用seatunnel是没有问题的,这里我先认为seatunnel 框架本身应该是没有问题的

2.再次分析zipfile对象

多次分析分析无果后,突然灵机一动,既然有这么多zipfile对象,那为啥不分析下这些对象具体是指的哪些对象,路径里的/tmp/jm_xx/xx里的东西引起了我的注意,这些文件都是运行任务时的临时文件交由blobserver管理的,之前也去这些目录看了,也没有这些文件,但是这里依然显示还有线程持有这个文件的句柄。具体来看(deleted) 这个显得不正常,于是我对比其它环境发现不会有这种文件,多次提任务后,此种类型的文件一直增加,经过对比我发现只要是读es任务就会有此问题。

在这里插入图片描述

在这里插入图片描述

3.分析seatunnel es connector 源码

经过之前的一系列信息
1.读es会有问题
2.问题发生成在jobmanager
幸好有对flink source 知识的积累,让我快速的把目标放在了ElasticsearchSourceSplitEnumerator类里
在这里插入图片描述

public class ElasticsearchSourceSplitEnumeratorimplements SourceSplitEnumerator<ElasticsearchSourceSplit, ElasticsearchSourceState> {
EsRestClient esRestClient}
4 怀疑EsRestClient(seatunnel里的对象) 对象没有被close

EsRestClient(seatunnel里的对象,对es restClient 的一些封装)
加上日志后,本地编译seatunnel对象后,运行发现close 已经生效,好像又没有思路了,代码也不多
都是正常运行的。

5 怀疑es 自带的RestClient 有问题

第一步EsRestClient 直接注释掉,多次运行没有问题,相当于没有读数据,就空运行
看来问题肯定在es自带的RestClient 上
观察这个对象在这里的作用,就是一个请求去得到索引信息

 String endpoint =String.format("%s/_cat/indices/%s?h=index,docsCount&format=json", hosts.get(0), index);

于是我把代码重写,直接通过CloseableHttpClient 去请求这部分,现象消失,问题解决,
问题进一步定位到RestClient上

   String endpoint =String.format("%s/_cat/indices/%s?h=index,docsCount&format=json", hosts.get(0), index);HttpClientUtil httpClientUtil = new HttpClientUtil();CloseableHttpClient httpClient = httpClientUtil.getHttpClient(connConfig);HttpGet httpGet = new HttpGet(endpoint);
6 继续观察RestClient

CloseableHttpAsyncClient 引起了我的注意,我是用的CloseableHttpClient 没问题


public class RestClient implements Closeable {private static final Log logger = LogFactory.getLog(RestClient.class);private final CloseableHttpAsyncClient client;
}

于是我用CloseableHttpAsyncClient 单独验证,问题复现,看来问题在这里

7 观察有没有CloseableHttpAsyncClient 和这相关的file bug

根据关键词一找,还真找到有这个问题,观察下版本修复情况在5.0.1 版本,再看下es 里引用的版本还是4.x, 到这问题找到。
file leak
在这里插入图片描述

总结

1.从最后的结论来看,是最底层组件所引发的问题,最后一步步暴露成flink 的heap oom
2.从问题分析的思路来看,还是要抓住问题的核心点,就是变化的是哪部分,包括环境,版本信息,任务信息。
3.要对所用的组件要有深入的了解,这里对flink source 有比较深入的了解,不然我没法直接定位到是ElasticsearchSourceSplitEnumerator 这个类的问题。
4.对MAT使用的分析还是要加深入了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP动态交互原型实例|墨刀变量控制+条件判断教程

引言 不同行业的产品经理在绘制原型图时&#xff0c;拥有不同的呈现方式。对于第三方软件技术服务公司的产品经理来说&#xff0c;高保真动态交互原型不仅可以在开发前验证交互逻辑&#xff0c;还能为甲方客户带来更直观、真实的体验。 本文第三部分将分享一个实战案例&#…

AI 驱动下的后端开发架构革命:从智能协同体系

AI 驱动下的后端开发架构革命&#xff1a;从智能协同体系 一、引言&#xff1a;AI 重构后端开发范式 在 2025 年的企业级技术演进中&#xff0c;人工智能正从辅助工具升级为核心架构要素。根据 Gartner《2025 智能技术栈成熟度报告》&#xff0c;传统 "人力编码 硬规则…

安卓基础(生命周期)

创建阶段&#xff1a;onCreate方法被调用&#xff0c;用于初始化 Activity&#xff0c;如设置布局等。启动阶段&#xff1a;依次调用onStart和onResume方法&#xff0c;让 Activity 变得可见并可与用户交互。暂停与恢复阶段&#xff1a;当 Activity 失去焦点但可见时&#xff0…

Uniapp: 下拉选择框 ba-tree-picker

目录 1、效果展示2、如何使用2.1 插件市场2.2 引入插件 3、参数配置3.1 属性3.2 方法 4、遇见的问题4.1、设置下拉树的样式 1、效果展示 2、如何使用 2.1 插件市场 首先从插件市场中将插件导入到项目中 2.2 引入插件 在使用的页面引入插件 <view click"showPicke…

Spring Boot实战:基于策略模式+代理模式手写幂等性注解组件

一、为什么需要幂等性&#xff1f; 核心定义&#xff1a;在分布式系统中&#xff0c;一个操作无论执行一次还是多次&#xff0c;最终结果都保持一致。 典型场景&#xff1a; 用户重复点击提交按钮网络抖动导致的请求重试消息队列的重复消费支付系统的回调通知 不处理幂等的风…

如何恢复极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 恢复极狐GitLab (BASIC SELF) 极狐GitLab 提供了一个命令行界面来恢复整个安装&#xff0c;足够灵活以满足您的需求。 恢复…

面试高阶问题:android后台任务(如数据同步、定位)消耗过多电量,导致用户投诉。你会如何分析和优化后台任务的执行?

在现代移动设备生态中,安卓系统以其开放性和灵活性占据了全球智能手机市场的绝大部分份额。作为一款功能强大的操作系统,安卓允许应用程序在后台执行各种任务,例如数据同步、定位服务、消息推送以及其他周期性更新。这些后台任务在提升用户体验方面扮演了不可或缺的角色——…

最近在学习web搞大屏看板

人到中年&#xff0c;delphi发展越来越不行&#xff0c;就业环境是真差啊&#xff0c;没办法&#xff0c;学呗 中国地图&#xff1a; // 中国地图function getChinaMapChart() {// 初始化echarts实例var myEcharts echarts.init(document.getElementById("china_box"…

117.在 Vue 3 中使用 OpenLayers 实现 CTRL 控制拖拽和滚动缩放

✨ 前言 在使用 OpenLayers 开发地图类项目时,我们有时会希望用户必须按下 CTRL(或 Mac 的 Command ⌘ 键)才能拖拽地图或使用鼠标滚轮缩放。这种交互方式能够避免用户在浏览页面时意外滑动或拖动地图,尤其是在地图嵌入页面中时非常有用。 本文将带你一步一步实现在 Vue …

MATLAB 控制系统设计与仿真 - 34

多变量系统知识回顾 - MIMO system 这一章对深入理解多变量系统以及鲁棒分析至关重要 首先,对于如下系统: 当G(s)为单输入,单输出系统时: 如果: 则: 所以 因此,对于SISO,系统的增益跟w有关系, 当G(s)为MIMO时,例如2X2时, 假设输入信号为:

ARCGIS PRO DSK 利用两期地表DEM数据计算工程土方量

利用两期地表DEM数据计算工程土方量需要准许以下数据&#xff1a; 当前地图有3个图层&#xff0c;两个栅格图层和一个矢量图层 两个栅格图层&#xff1a;beforeDem为工程施工前的地表DEM模型 afterDem为工程施工后的地表DEM模型 一个矢量图层&#xf…

最快打包WPF 应用程序

在 Visual Studio 中右键项目选择“发布”&#xff0c;目标选“文件夹”&#xff0c;模式选“自包含”&#xff0c;生成含 .exe 的文件夹&#xff0c;压缩后可直接发给别人或解压运行&#xff0c;无需安装任何东西。 最简单直接的新手做法&#xff1a; 用 Visual Studio 的“…

物联网通信协议——TCP与MQTT的对比

在物联网通信中&#xff0c;MQTT和TCP的实现方式和原理完全不同&#xff0c;因为两者属于协议栈的不同层级&#xff0c;解决的问题也不同。以下从协议层级、工作机制和典型场景三个角度详细解释&#xff1a; 1. 协议层级与定位 特性TCPMQTT协议层级传输层&#xff08;第4层&am…

【信息系统项目管理师】高分论文:论信息系统项目的成本管理(媒体融合采编平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划项目成本管理2、估算成本3、制订项目预算4、控制成本论文 2017年7月,我作为项目经理参与了 XX省媒体融合采编平台的建设,该项目总共投资530万元,其中服务器、存储、网络等硬件设备投资200万元、软…

策略模式简单介绍

什么是策略模式&#xff1f;一般用于什么场景&#xff1f; 策略模式一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使得它们可以相互替换&#xff0c;这样&#xff0c;客户端可以根据需要在运行时选择合适的算法&#xff0c;…

基于PAI+专属网关+私网连接:构建全链路 Deepseek 云上私有化部署与模型调用架构

DeepSeek - R1 是由深度求索公司推出的首款推理模型&#xff0c;该模型在数学、代码和推理任务上的表现优异&#xff0c;市场反馈火爆。在大模型技术商业化进程中&#xff0c;企业级用户普遍面临四大核心挑战&#xff1a; 算力投入成本高昂&#xff1a;构建千亿参数级模型的训…

【APM】How to enable Trace to Logs on Grafana?

系列文章目录 【APM】Observability Solution 【APM】Build an environment for Traces, Metrics and Logs of App by OpenTelemetry 【APM】NET Traces, Metrics and Logs to OLTP 【APM】How to enable Trace to Logs on Grafana? 前言 本文将介绍如何在Grafana上启用 …

在 Excel 中使用通义灵码辅助开发 VBA 程序

VBA 简介 VBA 是一种用于微软办公套件&#xff08;如 Word、Excel、PowerPoint 等&#xff09;的编程语言&#xff0c;它本质上是一种内嵌的脚本&#xff0c;或者可以认为是一段命令&#xff0c;其标准叫法被称为宏。 VBA 只能依赖于对应的软件进行开发&#xff0c;例如本文就…

vscode终端运行windows服务器的conda出错

远程windows服务器可以运行&#xff0c;本地vscode不能。 打开vscode settings.json文件 添加conda所在路径

紫外相机的应用范围及介绍

&#xff08;一&#xff09;工业领域 半导体制造&#xff1a;在晶圆制造和检测过程中&#xff0c;紫外相机起着关键作用。它可用于裸晶圆检测&#xff0c;能准确识别出制造过程中偶然引入的微粒&#xff08;如灰尘&#xff09;或因处理不当造成的划痕等缺陷。对于图案晶圆检查…