Flink內存配置

通過本文可以解決以下3個問題。

  • 了解flink內存和配置項相關概念。
  • 清楚UI中TM和JM各內存組件實際內存值的計算規則。
  • 根據實際情況對內存進行調整。

1. Flink進程內存

TM和JM二者均為JVM進程(JVM通常分成堆內和堆外兩部分)。TM和JM的內存定義為進程總內存(total process memory),從功能上分為flink應用程序使用的內存(堆內、堆外)和JVM運行進程使用的內存(堆外)兩大部分。

  • flink應用程序使用內存(total flink momory),下圖虛線內部分
  • JVM運行進程使用內存(JVM Metaspace和JVM Overhead),下圖虛線外部分

在這里插入圖片描述

設置JM或TM內存最簡單的方式是設置total process memorytotal flink momory之一。其他內存組件將根據默認值和額外配置自動調整。不建議同時顯式設置total process memorytotal flink momory,可能會造成內存配置沖突導致部署失敗。配置其他內存組成部分時也需要注意可能產生的沖突配置。

JM和TM的total process memorytotal flink momory的配置項分別為jobmanager.memory.process.sizejobmanager.memory.flink.sizetaskmanager.memory.process.sizetaskmanager.memory.flink.size。該4個參數均無默認值。

設置JM或TM內存的另一種方法是配置total flink momory中以下內存組件的大小。

  • JM:jobmanager.memory.heap.size (上圖藍色部分)。
  • TM:taskmanager.memory.task.heap.size (上圖藍色部分) 和 taskmanager.memory.managed.size (上圖綠色部分)。

上述3個參數無默認值,當手動配置這些參數后,建議既不要配置total process memory,也不要配置total flink momory,否則很容易導致內存配置沖突。

在內存組件中以兩部分內存按比例分配,同時受最大、最小值限制。

  • JVM Overhead(JM、TM) 按比例分配total process memory的一部分
  • Network memory(TM) 按比例分配total flink momory的一部分

示例如下

total Process memory = 1000MB
JVM Overhead min = 64MB
JVM Overhead max = 128MB
JVM Overhead fraction = 0.1

上述配置下,JVM Overhead的內存大小為1000*0.1=100MB,在64~128之間。

如果將min和max設置成相同的值,則會將內存固定為該大小。如果按比例計算出的內存小于最小值,則實際的內存大小將為最小值的大小。如果設置了total process memory和其他內存組件的大小,可能會忽略比例配置的情況,這時JVM Overhead則為total process memory的剩余部分,但結果仍然受最大最小值的限制,否則配置將失敗。

1.1. JVM參數

Flink將在啟動進程時根據配置或派生的內存組件值明確添加如下與內存相關的JVM參數

  • -Xmx and -Xms
    TM:Framework + Task Heap Memory。
    JM:JVM Heap Memory
  • -XX:MaxDirectMemorySize
    始終僅為TM添加,JM時只有當設置了jobmanager.memory.enable-jvm-direct-memory-limit參數時該JVM參數才會添加到JM中
    TM:Framework + Task Off-heap + Network Memory
    JM:Off-heap Memory
    注意:用戶代碼使用的native non-direct內存也可算作堆外內存的一部分
  • -XX:MaxMetaspaceSize
    TM:JVM Metaspace
    JM:JVM Metaspace

2. TaskManager內存

2.1. 內存構成

  • 應用程序使用內存,圖中虛線部分
    • JVM heap,虛線內藍色部分
    • managed memory,虛線內綠色部分
    • other direct(or native) memory,虛線內黃色部分
      • frameworkd off-heap內存,flink框架使用的堆外內存
      • task off-heap內存,task使用的堆外內存
      • network memory,網絡內存
  • JVM運行進程內存,圖中JVM specific memory部分(JVM Metaspace和JVM Overhead)

內存模型明細

在這里插入圖片描述

可以將native non-direct memory(堆外非直接內存)使用量算作框架堆外或任務堆外內存的一部分,但是這樣會導致直接內存限制更高。

JVM內存通常情況下分成heap memory 和 off-heap memory,即堆內存和堆外內存。堆內存是JVM管理的主要內存區域,用于存儲對象和類實例。堆外內存通常關注與直接內存和手動管理的內存區域。

native memeory、direct memory、non-direct memeory(本地內存、直接內存和非直接內存)?
本地內存指的是JVM外部所有的內存,包括堆外內存等。
直接內存由java.nio包中的ByteBuffer類通過allocateDirect()方法分配的內存(JVM堆外內存),直接分配在操作系統的內存中。大小受限于操作系統的可用內存。
非直接內存由ByteBuffer類的allocate()方法分配的內存。這部分內存通常是在堆內的,由JVM管理。

直接內存可以直接與操作系統的本地I/O操作交互,避免了在Java堆和本地操作系統內存之間的數據復制,因此數據處理起來非常高效,但是由于在堆外,不受JVM垃圾回收機制的直接管理,因此使用起來需要小心。
非直接內存在堆內,優缺點同直接內存相反。

2.2. TM中所有內存組成部分參數

  • 框架堆內存(Framework Heap Memory)
    taskmanager.memory.framework.heap.size 默認值128MB。
    分配給 Flink 框架的 JVM 堆內存(進階配置)。不建議手動配置
  • 任務堆內存(Task Heap Memory)
    taskmanager.memory.task.heap.size 無默認值。
    分配給 Flink 應用程序運行算子和用戶代碼的 JVM 堆內存。
  • 管理內存(Managed memory)
    taskmanager.memory.managed.size 無默認值。
    taskmanager.memory.managed.fraction 默認值0.4(total flink momory占比)
    由 Flink 管理的本地內存(堆外),用于排序、哈希表、緩存中間結果及 RocksDB State Backend。
  • 框架堆外內存(Framework Off-heap Memory)
    taskmanager.memory.framework.off-heap.size 默認值128MB。不建議手動配置
    用于 Flink 框架的堆外(直接或本地)內存((進階配置)。
  • 任務堆外內存(Task Off-heap Memory)
    taskmanager.memory.task.off-heap.size 默認值0bytes。
    分配給 Flink 應用的算子的堆外(直接或本地)內存。
  • 網絡內存(Network Memory)
    taskmanager.memory.network.min 默認值64MB。
    taskmanager.memory.network.max 默認值無窮大。
    taskmanager.memory.network.fraction 默認值0.1(total flink momory占比)
    用于任務之間數據傳輸的本地內存(例如網絡傳輸緩沖)。這塊內存被用于分配網絡緩沖。
  • JVM 空間(JVM Metaspace)
    taskmanager.memory.jvm-metaspace.size 默認值256MB。
    Flink JVM 進程的 Metaspace。
  • JVM 開銷(JVM Overhead)
    taskmanager.memory.jvm-overhead.min 默認值192MB。
    taskmanager.memory.jvm-overhead.max 默認值1GB。
    taskmanager.memory.jvm-overhead.fraction 默認值0.1(total process memory占比)
    用于JVM 其他開銷的本地內存,例如棧、代碼緩存、垃圾回收空間等。

當在IDE中本地啟動flink應用程序時,則只有taskmanager.memory.task.heap.sizetaskmanager.memory.task.off-heap.sizetaskmanager.memory.managed.sizetaskmanager.memory.network.mintaskmanager.memory.network.max參數會起作用。

2.3. 內存配置

配置內存最簡單的方式是配置total process memorytotal flink momory,前文已提到。

除此之外設置內存的另一種方式是設置Task Heap Memory和Managed Memory。當手動設置這兩部分內存后,建議即不要配置total process memory,也不要配置total flink momory,否則很容易導致內存配置沖突。

Managed memory顧名思義即由flink自己管理的內存(off-heap)。以下內容使用Manager memory

  • 流處理作業中用于RocksDB方式的State Backend。
  • 流處理和批處理作業中用于排序、哈希表及緩存中間結果。
  • 流處理和批處理作業中用于在python進程中執行UDF。

可以通過taskmanager.memory.managed.sizetaskmanager.memory.managed.fraction參數來設置managed memory內存的大小,前者直接設定內存大小的絕對值,后者通過total Flink memory內存的百分比來計算大小。如果二者同時設定占比的方式將會被覆蓋。如果二者都未設置將默認使用占比的形式。

flink將框架堆外內存和任務堆外內存包含在JVM直接內存限制中。雖然本機非直接內存使用量可以算作框架堆外內存或任務堆外內存的一部分,但在這種情況下會導致更高的 JVM 直接內存限制。網路內存也是JVM直接內存的一部分,但它由flink管理,并永遠保證不會超過其配置的大小。因此在這種情況下調整網絡內存大小不會有幫助。

舉個例子。

官方版本中,采用容器化部署方式,假設容器申請4GB內存,JVM Metaspace和JVM Overhead默認配置下,total flink momory的可用大小為

taskmanager.memory.process.size=4GB
JVM Metaspace=256MB
JVM Overhead=4GB*0.1=409MB
taskmanager.memory.flink.size=taskmanager.memory.process.size-JVM Metaspace-JVM Overhead=3431MB。

3. JobManager內存

JobManager的內存與TaskManager內存相似,但是結構更簡單。

3.1. 內存組成

  • JVM heap
    jobmanager.memory.heap.size 無默認值。
    堆內存,用于flink框架和作業提交期間(如某些批處理源)或檢查點完成回調中執行的用戶代碼
  • off-heap
    jobmanager.memory.off-heap.size 默認值128mb。
    JM的堆外內存,包括堆外內促你的直接內存和本地內存
  • JVM Metaspace
    jobmanager.memory.jvm-metaspace.size 默認值256mb
    flink JVM進程的元空間
  • JVM Overhead
    jobmanager.memory.jvm-overhead.min 默認值192mb
    jobmanager.memory.jvm-overhead.max 默認值1gb
    jobmanager.memory.jvm-overhead.fraction 默認值0.1(total process memory占比)
    用于其他JVM開銷的本地內存,如stack、代碼緩存、垃圾收集器空間等

3.2. 內存配置

配置內存最簡單的方式是配置total process memorytotal flink momory,前文已提到。

除此之外設置內存的另一種方式是配置JVM Heap Memory。當手動配置改內存后,建議既不要配置total process memory,也不要配置total flink momory,否則很容易導致內存配置沖突。

當在IDE中本地啟動應用程序時,不需要配置內存選項,并且JM的內存選項都將不生效。

4. 內存調優指南

  • standalone部署模式

建議通過配置total flink momory的方式為flink自身配置內存值。

如果因JVM metaspace 導致問題,也可以調整該配置項。

由于JVM Overhead并不由flink或部署環境控制因此total process memory是無關緊要的。這種情況下只有執行機器的物理資源才重要。

  • 容器化部署

建議配置total process memory,它聲明應為flink進程分配多少內存,并與請求的容器大小相對應。

如果配置了total flink momory,flink將隱式的添加JVM內存組件來計算total process memory的值,并請求具有相同內存大小的容器。

如果flink或用戶代碼分配了超過容器大小的非托管堆外內存,則作業可能會失敗。因為部署環境可能會殺死有問題的容器。

  • state backend

僅和TM相關

使用HashMap state backend時將managed memory大小設置為0,從而使用戶代碼可以分配到最大的堆內存。

使用rocksDB state backend時,在默認情況下rocksDB設置為native內存分配限制為managed memory內存大小。因此為狀態保留足夠大的managed memory內存非常重要。

  • 批作業

僅和TM相關

flink批作業運算符利用managed memory內存來提高運行效率。這樣,某些操作可以直接在原始數據上執行,無需反序列化為Java對象。
對批作業flink將在不超過managed memory限制的前提下,嘗試分配和使用盡可能多的managed memory。當managed memory內存不足時,將會溢出到磁盤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88325.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88325.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88325.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最新發布 | “龍躍”(MindLoongGPT)大模型正式發布!龍躍而起,推動中國方案走向全球智能體前沿

在人工智能快速演進的今天,生成式大模型正成為推動技術變革的核心引擎。繼語言、圖像、視頻等領域實現突破之后,下一階段的技術焦點,正加速向“具身智能”遷移。具身智能強調智能體對物理世界的感知、理解與互動能力,是實現通用人…

【系統分析師】2019年真題:論文及解題思路

文章目錄 試題一 論系統需求分析方法試題二 論系統自動化測試及其應用試題三 論處理流程設計方法及應用試題四 論企業智能運維技術與方法 試題一 論系統需求分析方法 系統需求分析是開發人員經過調研和分析,準確理解用戶和項目 的功能、性能、可靠 性等要求&#x…

在PHP環境下使用SQL Server的方法

當您處在PHP環境并想使用SQL Server作為數據庫服務器時,您需要將SQL Server連接到PHP。這涉及到一些步驟,我們會逐一說明并提供示例以指導你。 1.安裝SQL Server驅動: 首先,您需要在PHP環境中安裝對應的SQL Server驅動&#xff0…

RISC-V h拓展

https://tinylab.org/riscv-kvm-virt-mode-switch/ https://tinylab.org/riscv-kvm-virt-trap/ 特權模式 指令集中約定用虛擬化模式 V (virtualization mode) 來標記當前是否是在 Guest 系統中運行。V1 表示當前確實運行在 Guest 系統中,V0 則表示不運行在 Guest 中…

HCIA-華為VRP系統基礎

前言:本博客僅作記錄學習使用,部分圖片出自網絡,如有侵犯您的權益,請聯系刪除 本篇筆記是根據B站上的視頻教程整理而成,感謝UP主的精彩講解!如果需要了解更多細節,可以參考以下視頻:…

OSS大數據分析集成:MaxCompute直讀OSS外部表優化查詢性能(減少數據遷移的ETL成本)

(1)數據存儲與分析分離的痛點 傳統架構中,OSS作為廉價存儲常與MaxCompute計算引擎分離,導致ETL遷移成本高企。某電商案例顯示:每日300TB日志從OSS導入MaxCompute內部表,產生以下問題: 延遲&…

vue | vue-macros 插件升級以及配置

Vue Macros 是一個為 Vue.js 提供更多宏和語法糖的開源項目vue-macros/vue-macros: Explore and extend more macros and syntax sugar to Vue. 問題:npm run build-only 打包時,報錯:[Vue] Load plugin failed: vue-macros/volar 排查發現…

瑞芯微elf2開發板(rk3588)實現ros2humble下部署yolov5模型與Astrapro相機集成實現目標檢測

版本信息總結以及工具介紹 組件版本說明RKNN Lite2.1.0嵌入式端推理庫RKNN Runtime2.1.0運行時庫 (967d001cc8)RKNN Driver0.9.8NPU驅動程序模型版本6RKNN模型格式版本工具鏈版本2.1.0708089d1模型轉換工具鏈Python3.10編程語言OpenCV4.x圖像處理庫目標平臺rk3588Rockchip RK3…

Web前端入門:JavaScript 事件循環機制中的微任務與宏任務

JS 是單線程語言。這句話對不對? 按照目前的情況來看,JS 自從支持了 Web Worker 之后,就不再是單線程語言了,但 Worker 的工作線程與主線程有區別,在 Worker 的工作線程中無法直接操作 DOM、window 對象或大多數瀏覽器…

【論文筆記】【強化微調】TinyLLaVA-Video-R1:小參數模型也能視頻推理

[2504.09641] TinyLLaVA-Video-R1: Towards Smaller LMMs for Video Reasoning 1. 引述 繼之前的一篇 Video-R1 的工作,一篇新的關于視頻推理的工作很快就上傳到 Arxiv 上 “占坑” 了,這個工作是關于使用小參數(3B)的 LLM 進行視…

基于元學習的回歸預測模型如何設計?

1. 核心設計原理 目標:學習一個可快速適應新任務的初始參數空間,使模型在少量樣本下泛化。數學基礎: MAML框架: min ? θ ∑ T ~ p ( T ) [ L T ( f θ ? η ? θ L T ( f θ ( D T t r a i n ) ) ( D T t e s t ) ) ] \min…

MyBatis Plus與P6Spy日志配置

前言 在開發基于Spring Boot和MyBatis Plus的項目時,日志功能是調試和優化SQL查詢的核心工具。通過合理配置日志輸出,開發者可以直觀查看生成的SQL語句、執行時間、參數值以及潛在的性能瓶頸。 一、MyBatis Plus日志配置 1.1 基礎配置:直接…

SpringCloudGateway(spel)漏洞復現 Spring + Swagger 接口泄露問題

環境配置 gateway Spring Cloud : 這個就是分布式的微服務組件 微服務 : 一般指的是獨立的,專注于一項功能的服務 Gateway 這個其實是個云端的網關配置(他的作用就是對訪問web的流量進行防護比如一些爬蟲的阻截&#xff0…

服務器手動安裝并編譯R環境庫包:PROJ→RGDAL

目錄 方式1:conda-forge安裝錯誤:缺乏libnsl.so.1? 方法一:查找系統中是否已有此庫替補方案:采用libnsl.so.3鏈接 libnsl.so.1? 方法二:系統中沒有安裝 libnsl.so.1 → 手動安裝? 方法三:使用 Conda 安裝…

教育技術學讀計算機論文的提示詞

角色: 你是一位經驗豐富的計算機專業教授,擅長用通俗易懂的語言向初學者解釋復雜概念。我現在正在學習閱讀計算機科學領域的算法論文,但我的基礎比較薄弱(了解編程基礎如變量、循環、函數,了解一點數據結構和算法概念如數組、鏈表、排序,但對高級術語和數學證明不熟悉)。…

棋盤格標定板和圓形標定板的優劣性

來源:deepseek 在相機標定中,棋盤格標定板和圓形標定板(或圓點陣列標定板)是最常用的兩種類型。它們各有優劣,選擇哪種取決于具體的應用場景、需求以及使用的標定算法。以下是它們的主要優劣對比: &#…

2025年UDP洪水攻擊防御指南:從7.3Tbps攻防戰看原理與實戰

45秒37.4TB流量!一場刷新歷史紀錄的DDoS攻擊正在顛覆傳統防御體系 一、什么是UDP洪水攻擊? UDP洪水攻擊(UDP Flood)是一種利用用戶數據報協議(UDP) 的無連接特性發起的分布式拒絕服務(DDoS&…

一種集成統計、視覺和基于規則方法的新型可解釋醫學圖像分類人工智能框架|文獻速遞-最新論文分享

Title 題目 A novel explainable AI framework for medical image classificationintegrating statistical, visual, and rule-based methods 一種集成統計、視覺和基于規則方法的新型可解釋醫學圖像分類人工智能框架 01 文獻速遞介紹 人工智能(AI)…

洛谷 P10113 [GESP202312 八級] 大量的工作溝通-普及/提高-

題目描述 某公司有 N N N 名員工,編號從 0 0 0 至 N ? 1 N-1 N?1。其中,除了 0 0 0 號員工是老板,其余每名員工都有一個直接領導。我們假設編號為 i i i 的員工的直接領導是 f i f_i fi?。 該公司有嚴格的管理制度,每位…

數組題解——移除元素?【LeetCode】

27. 移除元素 快慢指針法 算法思路 使用雙指針(fast和slow)遍歷數組。 fast指針遍歷每一個元素。slow指針指向下一個將被保留的位置。 如果nums[fast] ! val,就把nums[fast]賦值到nums[slow],并將slow向前移動一位。遍歷結束后…