flink 内存配置(二):设置TaskManager内存
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 Memory | taskmanager.memory.framework.heap.size | 专用于Flink框架的JVM堆内存 |
Task Heap Memory | taskmanager.memory.task.heap.size | JVM堆内存专用于Flink应用程序,用于运行flink operators和用户代码 |
Managed memory | taskmanager.memory.managed.size taskmanager.memory.managed.fraction | 由Flink管理的本地内存,保留被用于排序,哈希表,缓存中间结果和RocksDB状态后端 |
Framework Off-heap Memory | taskmanager.memory.framework.off-heap.size | 专用于Flink框架的堆外直接(或本地)内存 |
Task Off-heap Memory | taskmanager.memory.task.off-heap.size | 专用于Flink应用程序以运行操作符的堆外直接(或本地)内存 |
Network Memory | taskmanager.memory.network.min taskmanager.memory.network.max taskmanager.memory.network.fraction | 为 Task 之间的数据交换预留的直接内存(例如,通过网络传输的缓冲)是Flink总内存(Total Flink Size)的一个fractionated部分。这些内存用于分配网络缓冲区 |
JVM metaspace | taskmanager.memory.jvm-metaspace.size | Flink JVM进程的元空间大小 |
JVM Overhead | taskmanager.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 heap | taskmanager.memory.task.heap.size | 无限制 |
Task off-heap | taskmanager.memory.task.off-heap.size | 无限制 |
Managed memory | taskmanager.memory.managed.size | 128MB |
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:分配各个组件具体值
这种情况和以上两种并没区别,都是按公式一步步导出即可,这里不再举例。
相关文章:

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

【C++ 算法进阶】算法提升八
复杂计算 (括号问题相关递归套路 重要) 题目 给定一个字符串str str表示一个公式 公式里面可能有整数 - * / 符号以及左右括号 返回最终计算的结果 题目分析 本题的难点主要在于可能会有很多的括号 而我们直接模拟现实中的算法的话code会难写 要考虑…...

阿里云实时数据仓库HologresFlink
1. 实时数仓Hologres特点 专注实时场景:数据实时写入、实时更新,写入即可见,与Flink原生集成,支持高吞吐、低延时、有模型的实时数仓开发,满足业务洞察实时性需求。 亚秒级交互式分析:支持海量数据亚秒级交…...

生成式语言模型的文本生成评价指标(从传统的基于统计到现在的基于语义)
文本生成评价指标 以 BLEU 为代表的基于统计的文本评价指标基于 BERT 等预训练模型的文本评价指标 1.以 BLEU 为代表的基于统计的文本评价指标 1.BLEU(Bilingual Evaluation Understudy, 双语评估辅助工具) 所有评价指标的鼻祖,核心思想是比较 候选译文 和 参考…...

【网安案例学习】暴力破解攻击(Brute Force Attack)
### 案例与影响 暴力破解攻击在历史上曾导致多次重大安全事件,特别是在用户数据泄露和账户被盗的案例中。随着计算能力的提升和密码管理技术的进步,暴力破解的威胁虽然有所减弱,但仍需警惕,特别是在面对高价值目标时。 【故事一…...

时间序列预测(十八)——实现配置管理和扩展命令行参数解析器
如图,这是一个main,py文件,在此代码中,最开始定义了许多模型参数,为了使项目更加灵活和可扩展,便于根据不同的需求调整参数和配置,可以根据实际需要扩展参数和配置项。 下面是如何实现配置管理和扩展命令行…...

Vue问题汇总解决
作者:fyupeng 技术专栏:☞ https://github.com/fyupeng 项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 我们经常在使用Vue开发遇到一些棘手的问题,解决后通常要进行总结,避免下次重复…...

Spark学习
Spark简介 1.Spark是什么 首先spark是一个计算引擎,而不是存储工具,计算引擎有很多: 第一代:MapReduce廉价机器实现分布式大数据处理 第二代:Tez基于MR优化了DAG,性能比MR快一些 第三代:Spark…...

一些小细节代码笔记汇总
Python cv2抓取摄像头图片保存到本地 import cv2 import datetime, ossavePath "E:/Image/"if not os.path.exists(savePath):os.makedirs(savePath)cap cv2.VideoCapture(0) capture Falseif not cap.isOpened():print("无法打开摄像头")exit()while…...

L4.【LeetCode笔记】链表题的VS平台调试代码
不用调用87.【C语言】数据结构之链表的头插和尾插文章提到的头插函数 记下这个模板代码,可用于在Visual Studio上调试出问题的测试用例 如创建链表[1,2,3,4,5] #include <stdilb.h> // Definition for singly-linked list.struct ListNode {int val;struct ListNode *…...

JavaCV 之高斯滤波:图像降噪与细节保留的魔法
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s…...

VsCode显示空格
ctrl shift p选择Preferences: Open User Settings (JSON) 加上"editor.renderWhitespace": "all" {"cmake.configureOnOpen": true,"files.encoding": "gb2312","editor.fontVariations": false,"edito…...

.Net C# 基于EFCore的DBFirst和CodeFirst
DBFirst和CodeFirst 1 概念介绍 1.1 DBFirst(数据库优先) 含义:这种模式是先创建数据库架构,包括表、视图、存储过程等数据库对象。然后通过实体框架(Entity Framework)等工具,根据已有的数据…...

w012基于springboot的社区团购系统设计
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

笔记本降频超鬼锁屏0.39电脑卡到不行解决办法实操记录
1、最开始没发现cpu问题,我发现我电脑突然异常的卡顿,最开始我怀疑是不是微软win用久了或者自动更新导致的问题,于是自己重装了操作系统 发现问题依然存在 2、我怀疑难道我的 cpu 内存 固态硬盘 其中一个有点问题?心想要是硬盘的…...

优选算法第四讲:前缀和模块
优选算法第四讲:前缀和模块 1.[模板]前缀和2.【模板】二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为k的子数组6.和可被k整除的子数组7.连续数组8.矩阵区域和 1.[模板]前缀和 链接: link #include <iostream> #include <vector> using…...

ubuntu20.04 加固方案-设置限制su命令用户组
一、编辑/etc/pam.d/su配置文件 打开终端。 使用文本编辑器(如vim)编辑/etc/pam.d/su文件。 vim /etc/pam.d/su 二、添加配置参数 在打开的配置文件的中,添加以下参数: auth required pam_wheel.so 创建 wheel 组 并添加用户 …...

TDengine数据备份与恢复
TDengine数据备份与恢复 一、数据备份和恢复介绍二、基于 taosdump 进行数据备份恢复三、基于 taosExplorer 进行数据备份恢复3.1 taosExplorer 的安装与配置3.2 使用taosExplorer 进行数据备份 一、数据备份和恢复介绍 官网地址:TDengine - 数据备份和恢复 为了防止…...

2024最新的开源博客系统:vue3.x+SpringBoot 3.x 前后端分离
本文转载自:https://fangcaicoding.cn/article/54 大家好!我是方才,目前是8人后端研发团队的负责人,拥有6年后端经验&3年团队管理经验,截止目前面试过近200位候选人,主导过单表上10亿、累计上100亿数据…...

研究中的“异质性”、“异质性结果”是指?
“异质性”这个词在统计学和研究中指的是数据、现象或群体之间的差异,即不同个体、组别、区域或时间点的表现或特征并不相同。相对的概念是“同质性”,即所有个体或组别在某一方面表现相同或接近。 异质性(Heterogeneity)的含义 …...

Springboot整合AOP和redis
aop pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 开启自动代理 注意:在完成了引入AOP依赖包后,一般来说并不需要去做其他…...

freetype学习总结
freetype学习总结 目录 freetype学习总结1. LCD显示字符问题引入2. freetype概念2.1 嵌入式设备使用FreeType的方法步骤2.2 嵌入式设备使用FreeType的注意事项 3. freetype官方C示例3.1 example1.c源码 4. 嵌入式设备上使用FreeType的简单示例4.1 简单示例代码4.2 代码分析 5. …...

上海亚商投顾:沪指缩量调整 华为概念股午后爆发
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整,沪指、深成指午后跌超1%,创业板指一度跌逾2%,尾盘跌幅有…...

操作系统与进程【单身狗定制版】
大家好呀 我是浪前 今天给大家讲解的是操作系统与进程 祝愿所有点赞关注的人,身体健康,一夜暴富,升职加薪迎娶白富美!!! 点我领取迎娶白富美大礼包 前言: 我们今天我们来学习操作系统 当然啦,操作系统是一个很庞大的…...

监听el-table中 自定义封装的某个组件的值发现改变调用函数
监听el-table中 自定义封装的某个组件的值发现改变调用函数 当你在一个 el-table 中使用封装的自定义组件作为单元格内容时,监听这个组件的值变化并调用函数,可以通过以下步骤实现: 创建自定义组件:首先创建一个自定义的 Vue 组…...

frida安装
开始安装 frida https://github.com/frida/frida/releases 下载安装的时候查看自己手机是多少位的 adb shell getprop ro.product.cpu.abi # 按照自己的机型下载进行解压里面有个文件放入到手机中开始进入手机 然后按照下面的图执行命令 其中log 我只是看了下 不需要执行因为刚…...

链表详解(三)
目录 链表功能实现链表的查找SLNode* SLFind(SLNode* phead, SLNDataType x)代码 链表任意位置前插入void SLInsert(SLNode**pphead,SLNode* pos, SLNDataType x)代码 链表任意位置前删除void SLErase(SLNode**pphead,SLNode* pos)代码 链表任意位置后插…...

【RESP问题】RESP.app GUI for Redis 连接不上redis服务器
问题描述: 在使用RESP的时候出现地址和密码正确但是连接不上Redis服务器的情况,但是由于在之前我是修改过Redis的配置文件的,所以现在怀疑是防火墙的问题。 问题解决: 在[rootlocalhost ~]下输入以下命令打开防火墙 #放通6379/…...

【github 有趣项目】AMULE
官方网站github ‘All-platform’ P2P client based on eMule电骡社区文档 下载&安装 去官方网站下载(社区版一般版本较新),解压版解压打开即可。 点击“下一页”,输入名称,后边全都下一步即可 通过upnp设置端…...

【WRF数据准备】土地利用类型分类标准:USGS+MODIS IGBP 21
【WRF数据准备】土地利用类型分类标准:USGSMODIS IGBP 21 WRF常用土地类型分类MODIS IGBP 21USGSNLCD Landuse 选择土地利用分类标准替换城市土地类型后更改土地利用分类参考 WRF常用土地类型分类 WRF中土地利用类型最高分辨率是30s,且主要分为MODIS和U…...