当前位置: 首页 > news >正文

【大数据】Flink 内存管理(二):JobManager 内存分配(含实际计算案例)

Flink 内存管理》系列(已完结),共包含以下 4 篇文章:

  • Flink 内存管理(一):设置 Flink 进程内存
  • Flink 内存管理(二):JobManager 内存分配(含实际计算案例)
  • Flink 内存管理(三):TaskManager 内存分配(理论篇)
  • Flink 内存管理(四):TaskManager 内存分配(实战篇)

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Flink 内存管理(二):JobManager 内存分配

  • 1.分配 Total Process Size
  • 2.分配 Total Flink Size
  • 3.单独分配 Heap Size
  • 4.分配 Total Process Size 和 Heap Size
  • 5.分配 Total Flink Size 和 Heap Size

JobManager 是 Flink 集群的控制元素。它由三个不同的组件组成: 资源管理器(Resource Manager)、调度器(Dispatcher)和每个运行中的 Flink 作业的一个作业管理器(JobMaster)。

JobManager 的内存模型如下:
在这里插入图片描述
以上 Total Process Memory 的模型图可以分为以下的 4 个内存组件,如果在分配内存的时候,显示的指定了组件其中的 1 1 1 个或者多个,那么 JVM Overhead 的值就是在其它组件确定的情况下,用 Total Process Size - 其它获取的值,必须在 min - max 之间,如果没有指定组件的值,那么就按照 0.1 0.1 0.1 的比例进行计算得到,如果计算出的值小于 minmin,如果大于 maxmax,如果 minmax 指定的相等,那么这个 JVM Overhead 就是一个确定的值!

内存组件
配置选项
内存组件的功能
JVM Heapjobmanager.memory.heap.sizeJobManager 的 JVM 堆内存大小。这个大小取决于提交的作业个数和作业的结构以及用户代码的要求。主要用来运行 Flink 框架,执行作业提交时的用户代码以及 Checkpoint 的回调代码。
Off-Heap Memoryjobmanager.memory.off-heap.sizeJM 的对外内存的大小。涵盖了所有 Direct 和 Native 的内存分配。用来执行 akka 等外部依赖,同时也负责运行 Checkpoint 回调及作业提交时的用户代码,有默认值 128 M 128M 128M
JVM Metaspacejobmanager.memory.jvm-metaspace.sizeJM 的元空间大小,有默认值 256 M 256M 256M, 属于 Native Memory。
JVM Overheadjobmanager.memory.jvm-overhead.min jobmanager.memory.jvm-overhead.max jobmanager.memory.jvm-overhead.fractionJVM 额外开销。为 Thread Stacks,Code Cache,Garbage Collection Space 预留的 Native Memory,有默认的 faction of total process size,但是必须在其 min & max 之间。

在 《Flink 内存管理(一):设置 Flink 进程内存》中我们提到,必须使用下述三种方法之一配置 Flink 的内存(本地执行除外),否则 Flink 启动将失败。这意味着必须明确配置以下选项子集之一,这些子集没有默认值。

序号for TaskManagerfor JobManager
1️⃣taskmanager.memory.flink.sizejobmanager.memory.flink.size
2️⃣taskmanager.memory.process.sizejobmanager.memory.process.size
3️⃣taskmanager.memory.task.heap.sizetaskmanager.memory.managed.sizejobmanager.memory.heap.size

1.分配 Total Process Size

  • jobmanager.memory.process.size

在这里插入图片描述
在这里插入图片描述

此时我们只显示指定了 jobmanager.memory.process.size 的值,没有指定其它组件,此时整个 JobManager 的 JVM 进程能占用的内存为 2000 M 2000M 2000M

  • Total Process Size = 2000 M = 2000M =2000M(这是分配的基准值)
  • JVM Overhead 因为没有指定其它组件内存,所以被按照 0.1 0.1 0.1 的比例推断成: 2000 M × 0.1 × 1024 × 1024 = 209715203 B = 200 M 2000M × 0.1 × 1024 × 1024 = 209715203B = 200M 2000M×0.1×1024×1024=209715203B=200M
  • JVM Metaspace 默认值为 256 M 256M 256M
  • Off-Heap Memeory 默认值为 128 M 128M 128M
  • JVM Heap 最终被推断为 2000 M − 200 M − 256 M − 128 M = 1.38 G 2000M - 200M - 256M - 128M = 1.38G 2000M200M256M128M=1.38G

为啥 JVM Heap 只有 1.33 G B 1.33GB 1.33GB 而不是 1.38 G B 1.38GB 1.38GB 呢?

在这里插入图片描述
其实这个取决于你使用的 GC 算法会占用其中很小一部分固定内存作为 Non-Heap,该占用部分大小为: 1.38 − 1.33 = 0.05 G B 1.38-1.33 = 0.05GB 1.381.33=0.05GB

2.分配 Total Flink Size

  • jobmanager.memory.flink.size

在这里插入图片描述
在这里插入图片描述

此时我们只显示指定了 jobmanager.memory.flink.size 的值,也没有指定其它组件如 Heap Size,此时整个 JobManager 的 JVM 进程除了 JVM OverheadJVM Metaspace 之外能占用的内存为 2000 M 2000M 2000M

  • Total Flink Size = 2000 M = 1.95 G = 2000M = 1.95G =2000M=1.95G(这属于 Total Process Size 的组件之一,Overhead 只能最后按剩余的内存来被推断)
  • JVM Metaspace 默认值为 256 M 256M 256M(固定默认值)
  • Off-Heap Memeory 默认值为 128 M 128M 128M(固定默认值)
  • JVM Heap = 2000 M − 128 M − 80 M B ( G C 算法占用) = 1.75 G B = 2000M - 128M - 80MB(GC算法占用)= 1.75GB =2000M128M80MBGC算法占用)=1.75GB
  • 根据 JVM Overhead = = =(JVM Overhead + Metaspace 256 M 256M 256M + Flink Size 2000 M ) × 0.1 2000 M) ×\ 0.1 2000M)× 0.1,计算可得:
    • Total Process Size = 2.448 G B = 2.448GB =2.448GB
    • JVM Overhead = 2.448 G B × 0.1 = 262843055 B = 250.667 M B = 2.448GB × 0.1 = 262843055B = 250.667MB =2.448GB×0.1=262843055B=250.667MB,在 192 M ~ 1 G B 192M~1GB 192M1GB,为有效

最终资源的分配如以下日志所示:

在这里插入图片描述

3.单独分配 Heap Size

  • jobmanager.memory.heap.size

在这里插入图片描述
在这里插入图片描述

此时我们只显示指定了 jobmanager.memory.heap.size 的值,相当于显示配置了组件的值,此时整个 JobManager 的 JVM Heap 被指定为最大内存为 1000 M 1000M 1000M

  • JVM Heap 被指定为 1000 M 1000M 1000M,但是得从 GC 算法中扣除 41 M B 41MB 41MB,实际 JVM Heap = 959 M B = 959MB =959MB
  • JVM Metaspace 默认值为 256 M 256M 256M
  • Off-Heap Memeory 默认值为 128 M 128M 128M
  • Total Flink Size = 1128 M B = 1.102 G B = 1128MB = 1.102GB =1128MB=1.102GB
  • JVM Overhead = ( 1128 M B + 256 M + = (1128MB + 256M + =(1128MB+256M+ JVM Overhead ) × 0.1 ) × 0.1 )×0.1
    • JVM Overhead = 153.778 < 192 M B = 153.778 < 192MB =153.778<192MB(默认的 min),所以 JVM Overhead = 192 M B = 192MB =192MB
  • Total Process Size = 1128 M B + 256 M + = 1128MB + 256M + =1128MB+256M+ JVM Overhead = 1576 M B = 1.5390625 G B = 1.539 G B = 1576MB = 1.5390625GB = 1.539GB =1576MB=1.5390625GB=1.539GB

在这里插入图片描述

4.分配 Total Process Size 和 Heap Size

在这里插入图片描述
在这里插入图片描述
由于指定了 heap.size 内存组件的的大小,那么 JVM Overhead 就是取剩余的 Total Process Size 的内存空间。

  • Total Process Size = 2000 M B = 2000MB =2000MB && JVM Heap = 1000 M B = 1000MB =1000MB,实际只有 959 M B 959MB 959MB,因为减去了 41 M B 41MB 41MB 的 GC 算法占用空间
  • JVM Metaspace 默认值为 256 M 256M 256M
  • Off-Heap Memeory 默认值为 128 M 128M 128M
  • Total Flink Size = 1000 M B + 128 M B = 1128 M B = 1000MB + 128MB = 1128MB =1000MB+128MB=1128MB
  • JVM Overhead = 2000 M B − 1128 M B − 256 M B = 616 M B = 2000MB - 1128MB - 256MB = 616MB =2000MB1128MB256MB=616MB

在这里插入图片描述

5.分配 Total Flink Size 和 Heap Size

在这里插入图片描述
在这里插入图片描述

由于指定了 head.size 组件的大小,那么 Overhead 就按照剩余 Total Process Size 的内存空间分配。

  • Total Flink Size = 2000 M B = 2000MB =2000MB && JVM Heap = 1000 M B = 1000MB =1000MB,实际 959 M B 959MB 959MB,减去了 GC 算法的占用空间
  • JVM Off-Heap = 2000 M B − 1000 M B = 1000 M B = 2000MB - 1000MB = 1000MB =2000MB1000MB=1000MB
  • JVM Metaspace = 256 M B = 256MB =256MB
  • 首先根据 JVM Overhead = ( = ( =(JVM Overhead + + + Metaspace 256 M 256M 256M + + + Flink Size 2000 M ) × 0.1 2000M) × 0.1 2000M)×0.1
    • Total Process Size = 2.448 G B = 2.448GB =2.448GB
    • JVM Overhead = 2.448 G B × 0.1 = 262843055 B = 250.667 M B = 2.448GB × 0.1 = 262843055B = 250.667MB =2.448GB×0.1=262843055B=250.667MB,在 192 M ~ 1 G B 192M~1GB 192M1GB,为有效
  • 最终确定 Total Process Size = 2.448 G B = 2.448GB =2.448GB && JVM Overhead = 250.667 M B = 250.667MB =250.667MB

在这里插入图片描述

相关文章:

【大数据】Flink 内存管理(二):JobManager 内存分配(含实际计算案例)

《Flink 内存管理》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 4 篇文章&#xff1a; Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存Flink 内存管理&#xff08;二&#xff09;&#xff1a;JobManager 内存分配&#xff08;含实际…...

(2024,Sora 逆向工程,DiT,LVM 技术综述)Sora:大视觉模型的背景、技术、局限性和机遇回顾

Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 背景 2.1…...

MySQL基础(二)

文章目录 MySQL基础&#xff08;二&#xff09;1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…...

el-table 多选表格存在分页,编辑再次操作勾选会丢失原来选中的数据

el-table表格多选时&#xff0c;只需要添加type"selection"&#xff0c; row-key及selection-change&#xff0c;如果存在分页时需要加上reserve-selection&#xff0c;这里就不写具体的实现方法了&#xff0c;可以查看我之前的文章&#xff0c;这篇文章主要说一下存…...

备战蓝桥杯————如何判断回文链表

如何判断回文链表 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a;…...

linux 文本编辑命令【重点】

目录 vi&vim介绍 vim安装 vim使用 查找命令 find grep 文本编辑的命令&#xff0c;主要包含两个: vi 和 vim vi&vim介绍 作用: vi命令是Linux系统提供的一个文本编辑工具&#xff0c;可以对文件内容进行编辑&#xff0c;类似于Windows中的记事本 语法: vi file…...

C#面:ref 和 out 的区别

ref 关键字&#xff1a; 在使用 ref 关键字时&#xff0c;传递的参数必须在方法调用之前进行初始化。在方法内部&#xff0c;对 ref 参数的任何修改都会影响到原始变量。ref 参数在方法内部和外部都必须具有相同的类型。 out 关键字 out 参数在方法内部必须被赋值。在使用 ou…...

php脚本输出中文在浏览器中显示乱码

问题说明 这个问题一般出现在较低版本的php中&#xff0c;原因是php和浏览器的字符解析方式不对应 &#xff0c;导致中文字符被错误解析成乱码 &#xff08;注&#xff0c;此处的php版本任意切换是依赖于小皮面板&#xff08;phpstudy&#xff09;实现的&#xff0c;感兴趣可以…...

【Unity每日一记】角色控制器Character Contorller

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

Kafka入门介绍一

介绍 Kafka是一个分布式系统&#xff0c;由服务器和客户端组成&#xff0c;通过高性能TCP网络协议进行通信。它可以部署在本地和云中的裸机硬件、虚拟机和容器上环境。 服务器&#xff1a;Kafka作为一个或多个服务器的群集运行&#xff0c;这些服务器可以跨越多个数据中心或云…...

leetcode 3.反转链表;

1.题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.用例&#xff1a; 3.题目解析&#xff1a; &#xff08;1&#xff09;函数头&#xff1a; 要求返回结点&#xff0c;就 ListNode* reverseList(ListNode* head)&…...

【蓝桥杯】快读|min和max值的设置|小明和完美序列|​顺子日期​|星期计算|山

目录 一、输入的三种方式 1.最常见的Scanner的输入方法 2.数据多的时候常用BufferedReader快读 3.较麻烦的StreamTokenizer快读&#xff08;用的不多&#xff09; StreamTokenizer常见错误&#xff1a; 二、min和max值的设置 三、妮妮的翻转游戏 四、小明和完美序列 五…...

半小时到秒级,京东零售定时任务优化怎么做的?

导言&#xff1a; 京东零售技术团队通过真实线上案例总结了针对海量数据批处理任务的一些通用优化方法&#xff0c;除了供大家借鉴参考之外&#xff0c;也更希望通过这篇文章呼吁大家在平时开发程序时能够更加注意程序的性能和所消耗的资源&#xff0c;避免在流量突增时给系统…...

stm32——hal库学习笔记(ADC)

这里写目录标题 一、ADC简介&#xff08;了解&#xff09;1.1&#xff0c;什么是ADC&#xff1f;1.2&#xff0c;常见的ADC类型1.3&#xff0c;并联比较型工作示意图1.4&#xff0c;逐次逼近型工作示意图1.5&#xff0c;ADC的特性参数1.6&#xff0c;STM32各系列ADC的主要特性 …...

一周学会Django5 Python Web开发-Http请求HttpRequest请求类

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…...

element el-date-picker 日期组件置灰指定日期范围、禁止日期范围日期选择

JS如何将当前日期或指定日期转时间戳_javascript技巧_脚本之家 小于指定日期前的日期置灰 比如这里 指定日期是 2024-02-20 10:48:15 disabledDate(time) time是一个函数提供的时间用于比较 他是一个时间戳↓ 理解为我们想要置灰的时间 time.getTime() < timeStamps- 1 *…...

202434读书笔记|《繁星·春水》——残花缀在繁枝上,鸟儿飞去了,撒得落红满地,生命也是这般的一瞥么?

202434读书笔记|《繁星春水》——残花缀在繁枝上&#xff0c;鸟儿飞去了&#xff0c;撒得落红满地&#xff0c;生命也是这般的一瞥么&#xff1f; 繁星春水 《繁星春水》冰心著&#xff0c;共300多首小诗&#xff0c;并不是惊艳&#xff0c;就那么平凡而朴实的看完了。 繁星 黑…...

Golang 关于 interface 接口的理解

package mainimport "fmt"// 定义一个存储器接口&#xff1a;支持mysql存储、redis存储 type StorageManager interface {insert(data string) int // 增加update(id int, data string) int // 更新 }// 实现一个Mysql存储器 type Mysql struct{}func (mysql…...

SQL注入漏洞解析--less-7

我们先看一下第七关 页面显示use outfile意思是利用文件上传来做 outfile是将检索到的数据&#xff0c;保存到服务器的文件内&#xff1a; 格式&#xff1a;select * into outfile "文件地址" 示例&#xff1a; mysql> select * into outfile f:/mysql/test/one f…...

java高级——反射

目录 反射概述反射的使用获取class对象的三种方式反射获取类的构造器1. 获取类中所有的构造器2. 获取单个构造器 反射获取构造器的作用反射获取成员变量反射变量赋值、取值获取类的成员方法反射对象类方法执行 反射简易框架案例案例需求实现步骤代码如下 反射概述 什么是反射 反…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...