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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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向前移动一位。遍历结束后…