Flink内存模型--flink1.19.1

Flink 的 JobManager 和 TaskManager 在内存分配上有不同的职责和结构。以下是两者的内存分类及详细说明:


一、JobManager 内存分类

JobManager 主要负责作业调度、协调(如 Checkpoint 协调)、资源管理等,其内存需求相对较低,主要分为以下几个部分:
在这里插入图片描述

1. JVM 堆内存(JVM Heap)
  • 用途
    • 存储作业的元数据(如 JobGraph、ExecutionGraph)。
    • 管理 Checkpoint 协调信息(如 Checkpoint 触发逻辑)。
    • 处理客户端提交作业的请求(如 REST API 交互)。
  • 配置参数
    • jobmanager.memory.heap.size:直接指定堆大小(如 2048m)。
    • jobmanager.memory.heap.fraction:按比例分配(需结合总内存配置)。
2. JVM 元空间(Metaspace)
  • 用途:存储 JVM 加载的类元数据(Class Metadata)。
  • 配置参数
    • jobmanager.memory.jvm-metaspace.size:默认约 256m,可通过 -XX:MaxMetaspaceSize 调整。
3. JVM 直接内存(Direct Memory)
  • 用途:用于 Netty 网络通信的堆外内存(如 JobManager 与 TaskManager 间的心跳通信)。
  • 配置参数
    • jobmanager.memory.off-heap.size:默认较小(如 128m),一般无需调整。
4. JVM 开销(JVM Overhead)
  • 用途:为 JVM 自身预留的内存(如线程栈、本地方法调用)。
  • 配置参数
    • jobmanager.memory.jvm-overhead.min/max/fraction:通常占总内存的 10%。
5. 总内存公式
Total JobManager Memory = Heap + Metaspace + Direct Memory + JVM Overhead + 其他(如 Native 库)

二、TaskManager 内存分类

TaskManager 是数据计算的核心组件,其内存结构更为复杂,主要分为以下部分:
在这里插入图片描述

1. 框架堆内存(Framework Heap)
  • 用途:运行 Flink 框架本身的代码(如 Task 调度、Shuffle 管理)。
  • 配置参数
    • taskmanager.memory.framework.heap.size:默认 128m,一般无需调整。
2. 任务堆内存(Task Heap)
  • 用途:用户代码(如 Map、Filter 算子)的堆内存,存储用户创建的对象。
  • 配置参数
    • taskmanager.memory.task.heap.size:直接指定大小。
    • taskmanager.memory.task.heap.fraction:按比例分配(默认 0.4)。
3. 托管内存(Managed Memory)
  • 用途:Flink 自动管理的内存,用于批处理排序/哈希、RocksDB 状态后端、PyFlink 等(详见之前的总结)。
  • 配置参数
    • taskmanager.memory.managed.sizetaskmanager.memory.managed.fraction(默认 0.4)。
4. 网络缓冲区(Network Buffers)
  • 用途:TaskManager 间数据传输的缓冲区(如 Shuffle、Broadcast)。
  • 配置参数
    • taskmanager.memory.network.min/max/fraction:默认占总内存的 0.1
    • 每个 Buffer 大小:taskmanager.memory.segment-size(默认 32KB)。
5. JVM 元空间(Metaspace)
  • 配置参数
    • taskmanager.memory.jvm-metaspace.size:默认 256m
6. JVM 直接内存(Direct Memory)
  • 用途:用于堆外数据(如 RocksDB 直接访问内存、Netty 网络传输)。
  • 配置参数
    • taskmanager.memory.off-heap.size:默认不启用,需显式配置。
7. JVM 开销(JVM Overhead)
  • 配置参数
    • taskmanager.memory.jvm-overhead.min/max/fraction:默认占总内存的 0.1
8. 总内存公式
Total TaskManager Memory = Framework Heap + Task Heap + Managed Memory + Network Buffers + Metaspace + Direct Memory + JVM Overhead + 其他(如 Native 库)

三、配置示例与调优建议

1. JobManager 配置示例
jobmamager.memory.process.size: 8192m   # 总内存 
jobmanager.memory.heap.size: 4096m      # 堆内存 4GB
jobmanager.memory.jvm-metaspace.size: 512m  # 元空间 512MB
jobmanager.memory.jvm-overhead.max: 1024m   # JVM 开销上限 1GB
2. TaskManager 配置示例
taskmamager.memory.process.size = 10240m    # tm总内存
taskmanager.memory.task.heap.size: 4096m    # 任务堆内存 4GB
taskmanager.memory.managed.size: 8192m      # 托管内存 8GB(用于批处理或 RocksDB)
taskmanager.memory.network.fraction: 0.2    # 网络缓冲区占比 20%
taskmanager.memory.jvm-metaspace.size: 512m # 元空间 512MB
3. 调优建议
  • JobManager
    • 小规模作业:堆内存 2~4GB 足够。
    • 大规模作业(如千个 Task):需增大堆内存(如 8GB+)以处理更多元数据。
  • TaskManager
    • 批处理作业:增大托管内存(占比 50%~70%)减少磁盘溢出。
    • 流处理作业(使用 RocksDB):确保托管内存足够容纳 Block Cache(至少 1GB)。
    • 高吞吐场景:增加网络缓冲区大小或占比,避免背压。
    • 避免 OOM
      • 若用户代码占用堆内存过多,增大 taskmanager.memory.task.heap.size
      • 若元空间不足,调整 -XX:MaxMetaspaceSize

四、常见问题排查

  1. JobManager OOM

    • 现象:作业提交失败或频繁 Full GC。
    • 解决:增大 jobmanager.memory.heap.size,检查元数据规模(如超大状态)。
  2. TaskManager OOM

    • Task Heap OOM:用户代码生成过多对象 → 增大任务堆内存。
    • Managed Memory OOM:批处理溢出频繁或 RocksDB 缓存不足 → 增大托管内存。
    • Metaspace OOM:类加载过多 → 调整 -XX:MaxMetaspaceSize
  3. 网络瓶颈

    • 现象:反压(Backpressure)或低吞吐。
    • 解决:增大 taskmanager.memory.network.fractiontaskmanager.memory.segment-size

五、总结

  • JobManager:轻量级协调者,内存需求集中在堆和元空间。
  • TaskManager:核心计算节点,需平衡任务堆内存、托管内存和网络缓冲区。
  • 调优核心:根据作业类型(批/流)、状态后端(Heap/RocksDB)和集群规模动态调整。建议通过 Flink Web UI 监控内存使用率,逐步优化配置。

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

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

相关文章

华为数字化转型-方法篇

1 方法篇-3-愿景驱动的数字化转型规划 1.2 业务战略是数字化转型的龙头 1.3 数字时代,企业需要适时地调整业务战略 1.3.1 引入数字化商业模式 引入数字化商业模式包括改变与客户做生意的方式,改变销售的渠道,基于产业互联网重新定位与行 业…

常用的排序算法------练习4

1. 题目 2. 思路和题解 这道题是很经典的荷兰国旗问题,根据题目意思,要对这个数组按照颜色排序,而此时现在的红、白、蓝三个颜色分别对应0,1,2,因此可以想到使用冒泡排序对该数组进行排序。 代码如下&…

传统神经网络、CNN与RNN

在网络上找了很多关于深度学习的资料,也总结了一点小心得,于是就有了下面这篇文章。这里内容较为简单,适合初学者查看,所以大佬看到这里就可以走了。 话不多说,上图 #mermaid-svg-Z3k5YhiQ2o5AnvZE {font-family:&quo…

1371. 货币系统-dp背包问题

给定 V种货币(单位:元),每种货币使用的次数不限。 不同种类的货币,面值可能是相同的。 现在,要你用这 V种货币凑出 N 元钱,请问共有多少种不同的凑法。 输入格式 第一行包含两个整数 V 和 N…

python和Java的区别

Python和Java是两种流行的编程语言,它们之间有一些重要的区别: 语法:Python是一种动态类型的脚本语言,语法简洁明了,通常使用缩进来表示代码块。Java是一种静态类型的编程语言,语法更为严格,需要…

正则化是什么?

正则化(Regularization)是机器学习中用于防止模型过拟合(Overfitting)的一种技术,通过在模型训练过程中引入额外的约束或惩罚项,降低模型的复杂度,从而提高其泛化能力(即在未见数据上…

计算机网络——传输层(TCP)

传输层 在计算机网络中,传输层是将数据向上向下传输的一个重要的层面,其中传输层中有两个协议,TCP,UDP 这两个协议。 TCP 话不多说,我们直接来看协议报头。 源/目的端口号:表示数据从哪个进程来&#xff0…

界面控件DevExpress WinForms v25.1 - 人工智能(AI)方面全新升级

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

WinFrom真入门(1)——Windows窗体应用概念

窗体的基本结构 用Winform开发的桌面程序,是在Windows操作系统上运行的,这个不用多说。窗体(Form)的作用‌:窗体是用户交互的容器,承载按钮、文本框等控件,构成应用程序的界面‌。 在Windows操…

scss预处理器对比css的优点以及基本的使用

本文主要在vue中演示&#xff0c;scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量&#xff0c;可将常用的值&#xff08;如颜色、字体大小、间距等&#xff09;定义为变量&#xff0c;方便重复使用和统一修改。 <template><…

Postman 如何高效地转换时间戳?

在 Postman 中&#xff0c;时间戳的处理对于 API 请求和响应的调试和测试至关重要&#xff0c;正确处理时间戳可以确保数据的准确性和一致性&#xff0c;而 Moment 库和原生 JS 是两种常见的处理方式。此外&#xff0c;我们还将介绍 Apifox&#xff0c;它提供了更直观、更简便的…

iptables学习记录

一.四表 filter 表&#xff1a; 主要用于控制数据包的过滤&#xff0c;决定数据包是否允许进出及转发 。比如设置规则允许特定 IP 访问服务器的 SSH 端口&#xff08;22 端口&#xff09;&#xff0c;或禁止某些 IP 访问网站端口&#xff08;80 或 443 端口 &#xff09;。可作…

前端自动创建react项目脚手架

步骤&#xff1a;在终端窗口运行如下命令&#xff1a; npm create vitelatest 也可以指定 vite包 版本&#xff0c; 例如&#xff1a; npm create vite4.1.0 npm执行npm install 很慢 还出现证书问题 执行命令行:npm install -g create-vite npm error code UNABLE_TO_GET_IS…

[从零开始学习JAVA ] 了解线程池

前言&#xff1a; 在Java编程中&#xff0c;线程池是一个强大的工具&#xff0c;它能够管理和复用线程&#xff0c;提供高效的并发处理能力。通过线程池&#xff0c;我们可以有效地控制并发线程的数量&#xff0c;并降低线程创建和销毁的开销。本文将引导你深入了解Java中的线程…

Nginx — Nginx处理Web请求机制解析

一、Nginx请求默认页面资源 1、配置文件详解 修改端口号为8080并重启服务&#xff1a; 二、Nginx进程模型 1、nginx常用命令解析 master进程&#xff1a;主进程&#xff08;只有一个&#xff09; worker进程&#xff1a;工作进程&#xff08;可以有多个&#xff0c;默认只有一…

【C++标准IO库】字符串流

目录 一、字符串流概述 1.1 流的概念回顾 1.2 字符串流的定义和作用 二、istringstream 的使用 2.1 基本用法 2.2 常见应用场景 三、ostringstream 的使用 3.1 基本用法 3.2 常见应用场景 四、stringstream 的使用 4.1 基本用法 4.2 常见应用场景 五、字符串流的错…

C语言pthread库的线程休眠和唤醒的案例

一、代码如下 #include<stdio.h> #include<pthread.h> // 定义独占锁 pthread_mutex_t mutex; // 定义条件信号对象 pthread_cond_t condition; // 初始化函数 void init(){ int code pthread_mutex_init(&mutex, NULL); printf("共享锁初…

人脸照片比对 API 接口如何对接?

随着数字化程度加深&#xff0c;身份验证的重要性也日益凸显&#xff0c;它成为保障个人信息安全、维护交易秩序的关键环节。人脸照片比对 API 接口作为连接人脸比对技术与各类应用的桥梁&#xff0c;正发挥着越来越重要的作用&#xff0c;成为众多企业和开发者实现高效、安全身…

java学习笔记9——常用类

字符串相关的类&#xff1a; String 指向同一个地址可才相等 注意这个地方&#xff0c;两个person对象的name实际上指向的是同一个字符串常量池&#xff08;Tom&#xff09; String常用方法 总结&#xff1a; 1.string类的理解(以JDK8为例说明) 1.1 类的声明 public final cl…

Day 09

文章目录 指针数组指针和函数技术名词解释技术细节课堂笔记 指针数组 #include<stdio.h> int main() {int a[3] {0,1,2};//指针数组&#xff0c;它是数组&#xff0c;每个元素都是指针int *p[3];p[0] &a[0];p[0] a;p[1] &a[1];p[1] a1;p[2] &a[2];p[…