flink 内存配置(二):设置TaskManager内存

flink 内存配置(一):设置Flink进程内存

flink 内存配置(二):设置TaskManager内存

flink 内存配置(三):设置JobManager内存

flink 内存配置(四):内存调优和问题处理

flink 内存配置(五):网络缓存调优

TaskManager在Flink中运行用户代码。根据需要配置内存使用,可以极大地减少Flink的资源占用,提高作业的稳定性。
注意下面的讲解适用于TaskManager 1.10之后的版本。与JobManager进程的内存模型相比,TaskManager内存组件具有类似但更复杂的结构。

1. 配置 Total Memory

Flink JVM 进程的总内存(Total Process Memory)由 Flink 应用程序(Total Flink Memory,Flink 总内存)和 JVM 运行进程所消耗的内存组成。Flink 总内存( Total Flink Memory)包括 JVM Heap、Managed Memory(托管内存,由 Flink 管理)和其他 Direct Memory(或 Native Memory)的使用量。如下结构:

如果在本地运行Flink(例如在IDE中),而没有创建集群,那么只有一部分内存配置选项是相关的,详情见下面的本地执行章节。
否则,为TaskManagers 设置内存的最简单方法是配置总内存。下面将更详细地描述一种更细粒度的方法。
其余的内存组件将根据默认值或额外配置的选项自动调整。有关其他内存组件的更多细节,请参阅后面的章节。

2. 配置 Heap and Managed Memory

前面提到过,在Flink中设置内存的另一种方法是显式指定Task Heap Memory 和 Managed Memory。它让Flink能够更好地控制可用的JVM Heap 和 Managed Memory。

其余的内存组件将根据默认值或额外配置的选项自动调整。下面是关于其他内存组件的更多细节。

如果已明确配置了任务 Task Heap Memory 和 Managed Memory,建议既不要设置进程总内存(Total Process Memory),也不要设置 Flink 总内存(Total Flink Memory)。否则,很容易导致内存配置冲突。

2.1. Task (Operator) Heap Memory

如果你想保证用户代码有一定量的JVM堆可用,可以显式设置Task Heap Memory(taskmanager.memory.task.heap.size)。它会被添加到JVM的堆大小中,并专门用于运行用户代码的 Flink Operator。

2.2. Managed Memory

Managed memory(托管内存) 由Flink管理,并作为本地内存(堆外off-heap)分配。以下工作负载使用托管内存:

  • 流式作业可以将其用于RocksDB状态后端。
  • 流和批处理作业都可以使用它来排序、散列表和缓存中间结果。
  • 流和批处理作业都可以使用它在Python进程中执行用户定义的函数。

托管内存大小可以由以下配置:

  • 可通过 taskmanager.memory.managed.size 进行显式配置。
  • 或通过 taskmanager.memory.managed.fraction乘以Flink 总内存(Total Flink Memory)来计算出来。

如果同时设置了大小和比例,则大小优先于比例。如果既没有明确配置大小,也没有配置比例,则将使用默认比例。

如果你的作业包含多种类型的托管内存使用者,你可以控制如何在这些类型之间共享托管内存。配置选项 taskmanager.memory.managed.consumer-weights 可以为每种类型设置权重,Flink会按比例分配托管内存。有效的消费者类型有:

  • OPERATOR:用于内置算法。
  • STATE_BACKEND:用于流式传输中的 RocksDB 状态后端。
  • PYTHON:用于PYTHON进程。

例如,如果一个流作业同时使用RocksDB状态后端和Python udf,并且消费者权重配置为STATE_BACKEND:70, Python:30, Flink将为RocksDB状态后端保留70%的总管理内存,为Python进程保留30%。

对于每种类型,Flink只在作业中包含该类型的托管内存消费者时才分配托管内存。例如,如果一个流作业使用堆状态后端和Python udf,并且消费者权重配置为STATE_BACKEND:70, Python:30, Flink将为Python进程使用其所有的托管内存,因为堆状态后端不使用托管内存。

注意:对于未包含在consumer权重中的consumer类型,Flink不会为其分配托管内存。如果作业确实需要缺失的类型,则可能导致内存分配失败。默认情况下,包含所有消费者类型。只有当权重被显式配置/覆盖时,才会发生这种情况。

3. 配置 Off-Heap Memory(Direct or Native)

由用户代码分配的堆外内存应计入任务堆外内存(taskmanager.memory.task.off-heap.size)。

你也可以调整框架的堆外内存(Framework Off-Heap Memory)。但是只有在确定 Flink 框架需要更多内存时,才应该去更改该值。

Flink 将框架堆外内存(Framework Off-Heap Memory)和任务堆外内存(Task Off-Heap Memory)纳入 JVM 的直接内存(Direct Memory)限制。

注意:虽然本地非直接内存(Native Non-Direct Memory)的使用可以作为框架堆外内存或任务堆外内存的一部分,但在这种情况下会导致更高的 JVM 直接内存限制。

注意:网络内存(Network Memory)也是 JVM 直接内存的一部分,但它由 Flink 管理,并保证永远不会超过其配置大小。因此,调整网络内存大小对这种情况没有帮助。
详见下方的内存详细模型。

4. 详细内存模型

下表列出了如上所述的所有内存组件,以及影响各个组件大小的Flink配置选项。

组件配置项描述
Framework Heap Memorytaskmanager.memory.framework.heap.size专用于Flink框架的JVM堆内存
Task Heap Memorytaskmanager.memory.task.heap.sizeJVM堆内存专用于Flink应用程序,用于运行flink operators和用户代码
Managed memorytaskmanager.memory.managed.size
taskmanager.memory.managed.fraction
由Flink管理的本地内存,保留被用于排序,哈希表,缓存中间结果和RocksDB状态后端
Framework Off-heap Memorytaskmanager.memory.framework.off-heap.size专用于Flink框架的堆外直接(或本地)内存
Task Off-heap Memorytaskmanager.memory.task.off-heap.size专用于Flink应用程序以运行操作符的堆外直接(或本地)内存
Network Memorytaskmanager.memory.network.min
taskmanager.memory.network.max
taskmanager.memory.network.fraction
为 Task 之间的数据交换预留的直接内存(例如,通过网络传输的缓冲)是Flink总内存(Total Flink Size)的一个fractionated部分。这些内存用于分配网络缓冲区
JVM metaspacetaskmanager.memory.jvm-metaspace.sizeFlink JVM进程的元空间大小
JVM Overheadtaskmanager.memory.jvm-overhead.min
taskmanager.memory.jvm-overhead.max
taskmanager.memory.jvm-overhead.fraction
本地内存是为其他JVM开销保留的:例如线程堆栈、代码缓存、垃圾收集空间等,它是总进程内存的一个受限制的分块组件

 如你所见,一些内存组件的大小可以通过相应的选项简单地设置。其他组件可以使用多个选项进行调优。

5. Framework Memory

如果没有充分的理由,不应该更改框架的堆内存(Framework Heap Memory)和框架的堆外内存(Framework Off-Heap Memory)。只有在确定Flink需要为某些内部数据结构或操作增加内存时,才需要调整内存大小。它可能与特定的部署环境或作业结构相关,如高度并行性。此外,在某些情况下,Flink的依赖(如Hadoop)可能会消耗更多的直接内存或本地内存。

注意:Flink 目前既没有隔离 Framework Heap Memory 和 Task Heap Memory,也没有隔离 Framework Off-Heap Memory 和 Task Off-Heap Memory。框架和任务内存的分离可以在未来的版本中用于进一步的优化。

6. 本地执行(Local Execution)

如果你在本地机器上启动Flink作为单个java程序而不创建集群(例如从你的IDE),那么所有组件都被忽略,除了以下组件:

内存组件相关选项默认值
Task heaptaskmanager.memory.task.heap.size无限制
Task off-heaptaskmanager.memory.task.off-heap.size无限制
Managed memorytaskmanager.memory.managed.size128MB
Network memory

taskmanager.memory.network.min

taskmanager.memory.network.max

64MB

上面列出的所有组件都可以但不必为本地执行显式配置。如果没有配置,则将其设置为默认值。任务堆内存(Task Heap)和任务堆外内存(Task Off-Heap)被认为是无限大的((Long.MAX_VALUE 字节)。托管内存(Managed Memory)在本地执行模式下的默认值为128MB。

注意,在这种情况下,任务堆大小与实际堆大小没有任何关系。它可以与下一个版本带来的未来优化相关。已启动的本地进程的实际JVM堆大小并不受Flink控制,而是取决于如何启动进程。如果您想控制JVM堆大小,则必须显式传递相应的JVM参数,例如-Xmx、-Xms。

7. 实际配置效果展示

注意和上图的详细内存模型组成和各个配置项在不配置的时候的默认值结合着分析。即:

  • Total Process Size = Total Flink Size + JVM Metaspace + JVM Overhead
  • Total Flink Size = Total Heap Size + Total Off-Heap Size
  • Total JVM Heap Size = Task Heap + Framework Heap
  • Total Off-Heap = Managed Memory + Direct Memory(Task Off-Heap + Framework Off-Heap + Network Memory)
  • JVM Metaspace = taskmanager.memory.jvm-metaspace.size(默认值256m)
  • JVM Overhead = Total Process Size * taskmanager.memory.jvm-overhead.fraction(默认值0.1)
  • Task Heap = taskmanager.memory.task.heap.size
  • Framework Heap = taskmanager.memory.framework.heap.size(默认值128m)
  • Managed Memory = taskmanager.memory.managed.size(没配置的话就是 Total Flink Size * taskmanager.memory.managed.fraction(默认值0.4))
  • Task Off-Heap = taskmanager.memory.task.off-heap.size(默认值0)
  • Framework Off-Heap = taskmanager.memory.framework.off-heap.size(默认值128m)
  • Network Memory = Total Flink Size * taskmanager.memory.network.fraction(默认值0.1)
  • 其他配置值都可以在官网配置页面查看,注意有些 fraction会有对应的最大最小值限制范围。

情况1:只配置 Total Process Size

这里配置 Total Process Size 为 2048m,即 -Dtaskmanager.memory.process.size=2048m

(这里选择使用application mode 运行在yarn上)

可以看下内存是如何计算出以上配置值的:(下面值乘以系数的做了四舍五入处理,为了和图对应)

  • 首先只配置了 Total Process Size = 2048m,其他就都是取默认值或推导计算出。
  • JVM Metaspace = 256m
  • JVM Overhead = 2048m * 0.1 = 205m
  • Total Flink Size = 2048m - 256m - 205m = 1587m
  • Task Heap没指定所以先计算其他的值,最终减去其他值得到
  • Framework Heap = 128m
  • Managed Memory没有配置taskmanager.memory.managed.size,所以取值:1587m * 0.4 = 635m
  • Framework Off-Heap = 128m
  • Task Off-Heap = 0
  • Network Memory = 1587m * 0.1 = 159m(而且没超过最大最小值限制)
  • Direct Memory = 0 + 128m + 159m = 287m
  • Task Heap = Total Flink Size - Framework Heap - Framework Off-Heap - Task Off-Heap - Managed Memory - Network Memory,即 1587m - 128m - 128m - 0 - 635m - 159m = 538m
  • Total JVM Heap Size = 538m + 128m = 666m

从jobmanager日志和taskmanager日志上也能看到内存分配值:

情况2:只配置 Total Flink Size

这里配置 Total Flink Size 为 2048m,即 -Dtaskmanager.memory.flink.size=2048m

(这里选择使用Session Mode 运行在standalone上,注意使用哪种部署方式无关紧要,这里运行在session模式下,只是看到内存分配日志打印的更为清晰

测试环境的准备可以使用配置 conf/flink-conf.yaml里配置 taskmanager.memory.flink.size: 2048m

然后执行 bash bin/start-cluster.sh 然后看taskmanager的信息

可以看下内存是如何计算出以上配置值的:(下面值乘以系数的做了四舍五入处理,为了和图对应)

  • 首先只配置了 Total Flink Size = 2048m,其他就都是取默认值或推导计算出。
  • Task Heap没指定所以先计算其他的值,最终减去其他值得到
  • Framework Heap = 128m
  • Managed Memory没有配置taskmanager.memory.managed.size,所以取值:2048m * 0.4 = 819m
  • Framework Off-Heap = 128m
  • Task Off-Heap = 0
  • Network Memory = 2048m * 0.1 = 205m(而且没超过最大最小值限制)
  • Direct Memory = 0 + 128m + 205m = 333m
  • Task Heap = Total Flink Size - Framework Heap - Framework Off-Heap - Task Off-Heap - Managed Memory - Network Memory,即 2048m - 128m - 128m - 0 - 819m - 205m = 768m
  • Total JVM Heap Size = 768m + 128m = 896m
  • JVM Metaspace = 256m
  • (2048m + 256m+ JVM Overhead)*0.1 = JVM Overhead,得到JVM Overhead = 256m
  • Total Process Size = 2048m + 256m + 256m = 2560m

taskmanager日志上也能看到内存分配值:

情况3:分配各个组件具体值

这种情况和以上两种并没区别,都是按公式一步步导出即可,这里不再举例。

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

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

相关文章

基于SpringBoot沉浸式戏曲文化体验系统【附源码】

基于SpringBoot沉浸式戏曲文化体验系统 效果如下: 系统主页面 系统登陆页面 用户管理页面 戏曲剧目管理页面 戏曲倾听页面 活动信息管理页面 个人中心页面 研究背景 随着互联网技术的飞速发展,传统文化传播方式正面临着前所未有的变革。戏曲作为我国传…

P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法

讲解视频: P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法 知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法 一、算法、顺序结构程序设计任务分析 知识要点:算法…

RAG三件套运行的新选择 - GPUStack

GPUStack 是一个开源的大模型即服务平台,可以高效整合并利用 Nvidia、Apple Metal、华为昇腾和摩尔线程等各种异构的 GPU/NPU 资源,提供本地私有部署大模型解决方案。 GPUStack 可以支持 RAG 系统中所需要的三种关键模型:Chat 对话模型&…

SSM物联网养殖管理系统-计算机毕业设计源码03998

目录 1 绪论 1.1 研究背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程分析…

使用Python进行健康监测和分析的案例研究

健康监测和分析是指系统地使用健康数据来跟踪和评估个人或人群在一段时间内的健康状况。它包含一系列活动,从实时生理数据收集(如心率,血压和体温)到分析更复杂的健康记录(包括患者病史,生活方式选择和遗传…

RHCE 第四次作业

一.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 1.配置环境 [rootlocalhost ~]# yum install bind [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 2.配置DNS主服务器 [rootlocalhost ~]# vim /etc/named.conf options { …

打字机效果显示

文章目录 打字机效果显示一、效果图二、视频效果三、代码 打字机效果显示 一、效果图 二、视频效果 B站-打字机效果图 打字机效果 打字机效果 三、代码 框架&#xff1a; <div class"t_title"><span>我的能力</span> <!-- <span>使…

PyQt5实战——翻译的实现,成功爬取微软翻译(可长期使用)经验总结(九)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

[含文档+PPT+源码等]精品基于Nodejs实现的物流管理系统的设计与实现

基于Node.js实现的物流管理系统的设计与实现背景&#xff0c;主要源于物流行业的快速发展以及信息技术在物流管理中的广泛应用。以下是对该背景的具体阐述&#xff1a; 一、物流行业的快速发展 随着全球经济一体化的加速和电子商务的蓬勃发展&#xff0c;物流行业作为连接生产…

JavaWeb开发9

ResponseBody 类型&#xff1a;方法注解、类注解 位置&#xff1a;Controller方法上/类上 作用&#xff1a;将方法返回值直接响应&#xff0c;如果返回值类型是实体对象/集合&#xff0c;将会转换为JSON格式响应 说明&#xff1a;RestControllerControllerResponseBody; 统…

直播美颜SDK开发指南:实时美颜技术的架构与优化策略

时下&#xff0c;为了满足市场需求&#xff0c;许多企业开始开发自己的美颜SDK&#xff0c;通过集成到直播或视频应用中&#xff0c;实现实时美颜效果。接下来&#xff0c;笔者将从美颜SDK的架构设计和优化策略出发&#xff0c;深入探讨如何打造一个智能化的视频美颜平台。 一…

Leecode热题100-104.二叉树中的最大路径和

二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &#xff0c…

第六十三周周报 GCN-CNNGA

文章目录 week 63 GCN-CNNGA摘要Abstract1. 题目2. Abstract3. 文献解读3.1 Introduction3.2 创新点 4. 网络结构4.1 数据分析4.2 混合深度学习框架的发展4.3 Mul4.4 CNN block4.5 GCN block4.6 GRU block4.7 注意力机制4.8 模型评估标准 5. 实验结果5.1 不同邻接矩阵的性能评价…

学习笔记——MathType公式编号:右编号和随章节变化

1.如何在word文档中插入带有编号的公式&#xff1f; 步骤&#xff1a;(前提是已经安装mathtype) 2.MathType公式编号怎么随章节变化&#xff1f; 想要编号级数也随标题级数进行自动变化&#xff0c;则需要插入或修改文档的“分隔符” 步骤&#xff1a;

VS+QT开发 找不到宏$(Qt_INCLUDEPATH_) $(Qt_LIBS_)

问题&#xff1a;在VSQT开发环境&#xff0c;项目右键->属性->C/C->常规->附加包含目录->宏&#xff08;位置在右下角&#xff09;->右侧新弹出的属性框内搜索Qt_INCLUDEPATH_ 找不到的场景的解决办法。

STl学习-迭代器

1.迭代器种类 这五种迭代器的声明如下&#xff1a; truct output_iterator_tag {};//输出迭代器 truct input_iterator_tag{ };//输入迭代器 truct forward iterator tag : public input iterator tag {};//向前迭代器 truct bidirectional iterator tag :public forward iter…

亲测在Windows系统安装、使用、定制Ollama服务

一、前言 1.1 Ollama介绍 Ollama是一个专为在本地环境中运行和定制大型语言模型而设计的工具。它提供了一个简单而高效的接口&#xff0c;用于创建、运行和管理这些模型&#xff0c;同时还提供了一个丰富的预构建模型库&#xff0c;可以轻松集成到各种应用程序中。Ollama的目标…

aLoNg3x.2 | CrackMe

cm下载链接&#xff1a; https://n0zom1z0.lanzoup.com/iB4Gz2el88cb 密码:38sy crack目标是让register框去掉。不让patch&#xff0c;所以要真算出Code。 第一个难点&#xff1a; DELPHI。。。窗口文字与处理函数的定义在这种地方&#xff1a; 这个cancel处&#xff0c;只要…

STl学习-函数对象

1.含有状态的函数对象类 函数对象类除了 operator()之外也可以包含其他成员。函数对象类通常含有一些数据成员这些成员被用于定制调用运算符中的操作。举个例子&#xff0c;我们将定义一个打印 string 的类。默认情况下&#xff0c;会将内容写入到cout 中&#xff0c;每个stri…

U-Mail邮件网关有效防止企业邮箱系统被垃圾邮件轰炸

在现代社会&#xff0c;互联网企业为了提供更便捷的服务&#xff0c;常常会收集用户数据&#xff0c;构建自己的大数据资源库。然而&#xff0c;这种行为往往导致用户在不经意间泄露个人隐私&#xff0c;进而引发个人信息的非法交易和频繁的骚扰电话&#xff0c;这些问题已经引…