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.pswp.cn/web/76186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76186.shtml
英文地址,請注明出處:http://en.pswp.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;或因處理不當造成的劃痕等缺陷。對于圖案晶圓檢查…