Flink TaskManager内存管理机制介绍与调优总结

news2024/9/30 15:33:54

内存模型

因为 TaskManager 是负责执行用户代码的角色,一般配置 TaskManager 内存的情况会比较多,所以本文当作重点讲解。根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用,增强作业运行的稳定性。
TaskManager 内存模型如下。

如上图所示,下表中列出了 Flink TaskManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。

我们可以看到,有些内存部分的大小可以直接通过一个配置参数进行设置,有些则需要根据多个参数进行调整。
接下来,我们详细来看一下各个内存区域的含义、技术原理,以及 Flink 对它的默认值在什么场景下需要调整。

内存配置

下图的左边标注了每个区域的配置参数名,右边则是一个调优后的、使用 HashMapStateBackend 的作业内存各区域的 容量限制:它和默认配置的区别在于 Managed Memory 部分被主动调整为 0 ,后面我们会讲解何时需要调整各区域的大小,以最大化利用内存空间。

JVM 进程总内存(Total Process Memory

该区域表示在容器环境下, TaskManager 所在 JVM 的最大可用的内存配额,超用时可能被强制结束进程。我们可以通 过 taskmanager.memory.process.size 参数控制它的大小。
例如我们设置 JVM 进程总内存为 4G TaskManager 运行在 YARN 平台,如果 yarn.nodemanager.pmem - check- enabled 设为 true ,则也会在运行时定期检查容器内的进程是否超用内存。
如果进程总内存用量超出配额,容器平台通常会直接发送最严格的 SIGKILL 信号(相当于 kill - 9 )来中止 TaskManager,此时不会有任何延期退出的机会,可能会造成作业崩溃重启、外部系统资源无法释放等严重后果。
因此,在有硬性资源配额检查 的容器环境下,请务必妥善设置该参数,对作业充分压测后,尽可能预留一部分安全余量,避免 TaskManager 频繁被 KILL 而导致的作业频繁重启。

Flink 总内存(Total Flink Memory

该内存区域指的是 Flink 可以控制的内存区域,即上述提到的 JVM 进程总内存 减去 Flink 无法控制的 Metaspace (元空 间)和 Overhead (运行时开销)区域。 Flink 随后又把这部分内存区域划分为堆内、堆外( Direct )、堆外( Managed )等 不同子区域,后面我们会逐一讲解他们的配置指南。
对于没有硬性资源限制的环境,我们建议使用 taskmanager.memory.flink.size 参数来配置 Flink 总内存的大 小,然后 Flink 自己也会自动根据参数,计算得到各个子区域的配额。如果作业运行正常,则无需单独调整。
例如 4G 进程总内存 配置下, JVM 运行时开销( Overhead )占 进程总内存 10% 但最多 1G (下图是 409.6M ),元 空间(Metaspace )占 256M ;堆外直接( Direct )内存网络缓存占 Flink 总内存 10% 但最多 1G (下图是 343M ),框架堆 和框架堆外各占 128M ,堆外管控( Managed )内存占 Flink 总内存 40% (下图是 1372M 1.34G ),其他空间留给任务堆,即用户程序代码可以使用的内存空间(1459M 1.42G )。

        

JVM 堆内存(JVM Heap Memory

堆内存大家想必都不陌生,它是由 JVM 提供给用户程序运行的内存区域, JVM 会按需运行 GC (垃圾回收器),协助 清理失效对象。
当任务启动时, ProcessMemoryUtils#generateJvmParametersStr 方法会通过 - Xmx - Xms 参数设置堆内存的最大容量。
  
Flink 将堆内存从逻辑上划分为 框架堆 任务堆 两个子区域,分别是:
框架堆内存( Framework Heap Memory taskmanager.memory.framework.heap.size :默认是 128m
任务堆内存( Task Heap Memory taskmanager.memory.task.heap.size :如果未显式设置其大小,则会通过 扣减其他区域配额来计算得到。例如对于 4G 的进程总内存,扣除了其他区域后,任务堆可用的只有不到 1.5G
但需要注意的是, Flink 自身并不能精确控制框架自身及任务会用多少堆内存,因此上述配置项只提供理论上的计算依 据。如果实际用量超出配额,且 JVM 难以回收对象释放空间,则会抛出 OutOfMemoryError ,此时 Flink TaskManager 会退 出,导致作业崩溃重启。因此对于堆内存的监控是必须要配置的,当堆内存用量超过一定比率,或者 Full GC 时长和次数明显增长时,需要尽快介入并考虑扩容。
对于使用 HashMapStateBackend (旧版本称之为 FileSystem StateBackend )的流作业用户,如果在进程总内存固定的 前提下,希望尽可能提升任务堆的空间,则可以减少托管内存( Managed Memory 的比例。

JVM 堆外内存(JVM Off-Heap Memory

广义上的 堆外内存 指的是 JVM 堆之外的内存空间,而我们这里特指 JVM 进程总内存除了元空间( Metaspace )和运行 时开销(Overhead )以外的内存区域。因为上述两个区域是 JVM 自行管理, Flink 无法介入,我们后面单独划分和讲解。

托管内存(Managed Memory)

文章开头的总览图中,我们把托管内存区域设为 0 ,此时任务堆空间约 3G ;而使用 Flink 默认配置时,任务堆只有 1.5G。这是因为默认情况下,托管内存占了 40% Flink 总内存,导致堆内存可用的量变的相当少。因此我们非常有必要 了解什么是托管内存。
 
从官方文档和 Flink 源码上来看,托管内存主要有三大使用场景:
  • 批处理算法,例如排序、HashJoin 等。他们会从 Flink MemoryManager 请求内存片段(MemorySegment),而 MemoryManager 则会调用 UNSAFE.allocateMemory 分配堆外内存。
  • RocksDB StateBackendFlink 只会预留一部分空间并扣除预算,但是不介入实际内存分配。因此该类型的内存资源被 称为 OpaqueMemoryResource ,实际的内存分配还是由 JNI 调用的 RocksDB 自己通过 malloc 函数申请。
  • PyFlink。与 JNI 类似,在与 Python 进程交互的过程中,也会用到一部分托管内存。
显然,对于普通的流式 SQL 作业,如果启用了 RocksDB 状态后端时,才会大量使用托管内存。因此如果您的 业务场 景并未用到 RocksDB ,那么可以 调小托管内存的相对比例 taskmanager.memory.managed.fraction 或绝对大小 taskmanager.memory.managed.size ),以 增大任务堆的空间

直接内存(Direct Memory)

直接内存是 JVM 堆外的一类内存,它提供了相对安全可控但又不受 GC 影响的空间, JVM 参数是 - XX:MaxDirectMemorySize 。它主要用于:
  • 框架堆外内存(Framework Off-heap Memorytaskmanager.memory.framework.off-heap.size 参数,默认 128M,例如 Sort-Merge Shuffle 算法所需的内存;
  • 任务堆外内存(Task Off-heap Memorytaskmanager.memory.task.off-heap.size 参数,默认为 0,用于用户任务;
  • 网络内存(Network MemoryNetty Network Buffer 的网络传输,taskmanager.memory.network.fraction
等参数,默认 0.1 10% Flink 总内存。该值必须在 taskmanager.memory.network.min=64mb taskmanager.memory.network.max=infinite 之间。
在生产环境中,如果作业并行度非常大(例如大于 500 甚至 1000 ),则需要调大
taskmanager.network.memory.floating - buffers - per - gate taskmanager.network.memory.max - buffers - per- channel (例如从 8 调整到 1000 )和 taskmanager.network.memory.buffers - per - channel (例如从 2 调整到 500),避免 Network Buffer 不足导致作业报错。

JVM 元空间(JVM Metaspace

JVM Metaspace 主要保存了加载的类和方法的元数据, Flink 配置的参数是 taskmanager.memory.jvm- metaspace.size ,默认大小为 256M JVM 参数是 - XX:MaxMetaspaceSize
  
如果用户编写的 Flink 程序中,有大量的动态类加载的需求,例如一个用户作业,动态编译并加载了 44 万个类,此时 就容易出现元空间用量远超预期,发生 OOM 报错。此时就需要适当调大元空间的大小,或者优化用户程序,及时卸载无用的 Classloader

JVM 运行时开销(JVM Overhead

除了上述描述的内存区域外, JVM 自己还有一小块 自留地 ,用来存放线程栈、编译的代码缓存、 JNI 调用的库所分 配的内存等等,Flink 配置参数是 taskmanager.memory.jvm - overhead.fraction ,默认是 JVM 总内存的 10% 。该值范 围必须在 taskmanager.memory.jvm - overhead.min=196mb taskmanager.memory.jvm - overhead.max=1gb 之间。
  
对于旧版本( 1.9 及之前)的 Flink RocksDB 通过 malloc 分配的内存也属于 Overhead 部分,而新版 Flink 把这部分归 类到托管内存(Managed ),因此在生产环境下,如果 RocksDB 频繁造成内存超用,除了调大 Managed 托管内存外,也可以考虑调大 Overhead 区空间,以留出更多的安全余量。

总结

JVM 进程总内存( Total Process Memory ): TaskManager 所在 JVM 的最大可用的内存配额。
  • taskmanager.memory.process.size ,无默认值。
Flink 总内存( Total Flink Memory ):用于 Flink 框架的 JVM 堆内存。 JVM 进程总内存减去 Flink 无法控制的 Metaspace 和 Overhead 区域。
  
JVM 堆内存( JVM Heap Memory ):由 JVM 提供给用户程序运行的内存区域。
  • 框架堆内存(Framework Heap Memory):
  • taskmanager.memory.framework.heap.size ,默认 128mb
  • 任务堆内存(Task Heap Memory):用于 Flink 应用的算子及用户代码的 JVM 堆内存。
  • taskmanager.memory.task.heap.size ,无默认值,一般由计算得到。
JVM 堆外内存( JVM Off-Heap Memory ):
  • 托管内存(Managed Memory):由 Flink 管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地 内存。
  • taskmanager.memory.managed.fraction ,按比例分配,默认 0.4JVM 进程总内存的 40%);
  • taskmanager.memory.managed.size , 按大小分配,无默认值。
直接内存( Direct Memory ):
  • 框架堆外内存(Framework Off-heap Memory):例如 Sort-Merge Shuffle 算法所需的内存。
  • taskmanager.memory.framework.off-heap.size ,默认 128mb
  • 任务堆外内存(Task Off-heap Memory):用于用户任务。
  • taskmanager.memory.task.off-heap.size ,默认 0 bytes
  • 网络内存(Network Memory):Netty Network Buffer 的网络传输。
  • taskmanager.memory.network.fraction ,默认 0.1JVM 总内存的 10%)。该值必须在 taskmanager.memory.network.min=64mb taskmanager.memory.network.max=infinite 之间。

JVM 元空间(JVM Metaspace):主要保存加载的类和方法的元数据。         taskmanager.memory.jvm-metaspace.size :默认 256mb  

JVM 运行时开销( JVM Overhead ): JVM 自己还有一小块 自留地 ,用来存放线程栈、编译的代码缓存、 JNI 调用的库所分配的内存等等。
        taskmanager.memory.jvm- overhead.fraction ,默认 0.1 JVM 进程总内存的 10% )。该值范围必须在 taskmanager.memory.jvm- overhead.min=196mb taskmanager.memory.jvm - overhead.max=1gb 之间。

调整建议

通常情况下,不建议对 框架堆内存 框架堆外内存 进行调整。除非你非常肯定 Flink 的内部数据结构及操作需要更多的内存
配置 Flink 内存最简单的方法就是配置总内存。此外, Flink 也支持更细粒度的内存配置方式。 Flink 会根据默认值或其他配置参数自动调整剩余内存部分的大小。
运行命令时配置 JobManager TaskManager 内存的方式如下。
bin/flink run-application -d \
-t yarn-application \
-Dyarn.application.queue=default \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.memory.managed.size=0mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.mrhelloworld.flink.java.wordcount.WordCountDemo \
/root/flink-quickstart-demo.jar
yarn.application.queue :指定 YARN 队列;
jobmanager.memory.process.size :指定 JobManager 总进程内存大小;
taskmanager.memory.process.size :指定 TaskManager 的总进程内存大小,一般 2-8G YARN 默认最大给 8G
taskmanager.numberOfTaskSlots :指定 TaskManager Slot 数。

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

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

相关文章

Docker(二)安装指南:主要介绍 Docker 在 Linux 、Windows 10 和 macOS 上的安装

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 安装 Docker Docker 分为 stable test 和 nightly 三个更新频道。 官方网站上有各种环境下的 安装指南,这里主要介绍 Docker 在…

没有统计学背景的人学六西格玛:挑战与机遇并存

在当今追求高效率、高品质的时代,六西格玛方法已成为企业提升竞争力的关键法宝。但对于众多没有统计学背景的朋友来说,这一方法仿佛高不可攀。今天,就让我们一同探索,没有统计学背景的人学习六西格玛到底难不难? 一、难…

el-table实现搜索高亮展示并滚动到元素位置

效果展示&#xff1a; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

年龄性别预测2:Pytorch实现年龄性别预测和识别(含训练代码和数据)

年龄性别预测2&#xff1a;Pytorch实现年龄性别预测和识别(含训练代码和数据) 目录 年龄性别预测2&#xff1a;Pytorch实现年龄性别预测和识别(含训练代码和数据) 1.年龄性别预测和识别方法 2.年龄性别预测和识别数据集 3.人脸检测模型 4.年龄性别预测和识别模型训练 &a…

Oracle行转列函数,列转行函数

Oracle行转列函数&#xff0c;列转行函数 Oracle 可以通过PIVOT,UNPIVOT,分解一行里面的值为多个列,及来合并多个列为一行。 PIVOT PIVOT是用于将行数据转换为列数据的查询操作(类似数据透视表)。通过使用PIVOT&#xff0c;您可以按照特定的列值将数据进行汇总&#xff0c;并将…

Maxwell介绍

一、介绍 介绍&#xff1a;它读取MySQL binlog并将数据更改作为JSON写入Kafka、Kinesis和其他流媒体平台&#xff08;目前支持&#xff1a;kafka、RabbitMQ、Redis、file、Kinesis、Nats、Google Cloud Pub/Sub、Google Cloud Bigquery、SNS&#xff09; 版本&#xff1a;从v1.…

Git教程学习:01 Git简介与安装

目录 1 版本控制1.1 什么是版本控制系统&#xff1f;1.2 本地版本控制系统1.3 集中式版本控制系统1.4 分布式版本控制系统 2 Git简史3 Git的安装3.1 在Linux上安装3.2 初次运行Git前的配置 1 版本控制 1.1 什么是版本控制系统&#xff1f; 版本控制系统(Version Control Syst…

css 居中方式

居中分为水平居中和垂直居中 1. 水平居中1.1 文字text-align:center;1.2 盒子1.2.1&#xff1a;inline-block text-align 一 center;1.2.2&#xff1a;absolutetransform 一 父元素 display:relative;子元素 display:absolute; left:50%;transform: translatex(-50%);1.2.3&a…

一个好用的工具,对网工来说是绝杀技!

上午好&#xff0c;我是老杨。 提到用人&#xff0c;很多单位和管理者第一反应都是应聘者的能力。能力到底怎么界定&#xff0c;其实每个人都有不同的判定标准。 在我看来&#xff0c;做事专注&#xff0c;且能尽可能“偷懒”的网工 &#xff0c;就是我个人筛选员工的标准。 …

游戏开发要注意这几个问题

游戏开发是一个充满创意和挑战的过程。对于初学者和经验丰富的开发者来说&#xff0c;每个项目都是一个新的学习机会。然而&#xff0c;成功的游戏开发不仅仅是关于编码和设计&#xff1b;它还涉及到细致的规划、测试和市场洞察。以下是在开发游戏时需要特别注意的几个关键方面…

CentOS stream 9配置网卡

CentOS stream9的网卡和centos 7的配置路径&#xff1a;/etc/sysconfig/network-scripts/ifcfg-ens32不一样。 CentOS stream 9的网卡路径&#xff1a; /etc/NetworkManager/system-connections/ens32.nmconnection 方法一&#xff1a; [connection] idens32 uuid426b60a4-4…

区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一…

npm install 安装出错时尝试过的方法

使用npm cache clean --force清除缓存&#xff0c;然后将安装失败的项目中的node_modules文件夹以及package-lock.json文件删除&#xff08;package-lock.json是在npm install安装时生成的一份文件&#xff0c;用以记录当前状态下实际安装的各个npm package的具体来源和版本号&…

探索设计模式的魅力:抽象工厂模式的艺术

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;用于在不指定具体类的情况下创建一系列相关或相互依赖的对象。它提供了一个接口&#xff0c;用于创建一系列“家族”或相关依赖对象&#xff0c;而无需指定它们的具体类。 主要参…

Linux安装ossutil工具且在Jenkins中执行shell脚本下载文件

测试中遇到想通过Jenkins下载OSS桶上的文件&#xff0c;要先在linux上安装ossutil工具&#xff0c;记录安装过程如下&#xff1a; 一、下载安装ossutil&#xff0c;使用命令 1.下载&#xff1a;wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 2.一定要赋权限…

大创项目推荐 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

服务器数据恢复—OceanStor存储raid5热备盘同步数据失败的数据恢复案例

服务器数据恢复环境&#xff1a; 华为OceanStor某型号存储&#xff0c;存储内有一组由24块硬盘组建的raid5阵列&#xff0c;配置1块热备盘。 服务器故障&#xff1a; 该存储raid5阵列中有一块硬盘离线&#xff0c;热备盘自动激活并开始同步数据&#xff0c;在热备盘同步数据的…

C400/10/1/1/1/00嵌入式系统中的模块动态加载技术

基于模块化设计的嵌入式软件测试方法 "... 进行分析。 关键词&#xff1a;模块化设计 嵌入式软件 软件测试 ... 相对较小的模块。为了减少模块与模块之间的关联性&#xff0c;模块之间的逻辑结构 ... 执行后发生错误&#xff0c;则由模块&#xff22;和模块&…

【Alibaba工具型技术系列】「EasyExcel技术专题」摒除OOM!让你的Excel操作变得更加优雅和安全

摒除OOM&#xff01;让你的Excel操作变得更加优雅和安全 前提概要存在隐患问题解决方案更优秀的选择 EasyExcel的介绍说明技术原理对比POIEasyExcel技术原理图节省内存的开销 Maven仓库依赖基础API介绍&#xff08;参考官方文档&#xff09;实战案例读取Excel实现Demo数据模型D…

网络性能评估工具Iperf

一、网络性能评估工具Iperf Iperf是一款基于TCP/IP和UDP/IP的网络性能测试工具&#xff0c;它可以用来测量网络带宽和网络质量&#xff0c;还可以提供网络延迟抖动、数据包丢失率、***传输单元等统计信息。网络管理员可以根据这些信息了解并判断网络性能问题&#xff0c;从而定…