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

2024-02-25 15:04

本文主要是介绍【大数据】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 内存分配(含实际计算案例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745846

相关文章

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映