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.mzph.cn/web/58803.shtml

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

相关文章

线段树专题(1)

线段树 线段树可维护的信息类型 线段树可以维护的信息类型,父范围上的某个信息,可以用O(1)的时间,从子范围的信息加工得到,例如求某个范围的最大最小值,给某个范围每个位置加相同的数字,进行求和。 0到2范…

NoETL自动化指标平台为数据分析提质增效,驱动业务决策

直觉判断往往来源于多年的经验和专业知识,能够在复杂和不确定的环境中快速做出决策反应。但这种方式普遍存在主观偏见,缺乏合理的科学依据,无法全面、客观、精准地评估和识别市场趋势与用户需求,从而造成决策失误,给业…

软考高级架构 - 8.1 - 系统质量属性与架构评估 - 超详细讲解+精简总结

第8章 系统质量属性与架构评估 软件系统属性包括功能属性和质量属性,而软件架构重点关注质量属性。 8.1 软件系统质量属性 8.1.1 概述 软件系统的质量反映了其与需求的一致性,即:软件系统的质量高低取决于它是否能满足用户提出的需求&#…

Jmeter常见的几种报错及解决方案

在性能测试的过程中,使用JMeter进行负载测试是一项常见而重要的任务。然而,测试中常常会遇到各种报错,这些问题可能会影响测试结果的准确性。了解这些错误的原因及解决方案,是每位测试工程师必备的技能 进行Jmeter项目练习的时候…

《JavaEE进阶》----21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)>

PS: 开闭原则 定义和背景‌ ‌开闭原则(Open-Closed Principle, OCP)‌,也称为开放封闭原则,是面向对象设计中的一个基本原则。该原则强调软件中的模块、类或函数应该对扩展开放,对修改封闭。这意味着一个软…

仿真APP助力汽车零部件厂商打造核心竞争力

汽车零部件是汽车工业的基石,是构成车辆的基础元素。一辆汽车通常由上万件零部件组成,包括发动机系统、传动系统、制动系统、电子控制系统等,它们共同确保了汽车的安全、可靠性及高效运行。 在汽车产业快速发展的今天,汽车零部件…

现代Web开发:Vue 3 组件化开发实战

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 现代Web开发:Vue 3 组件化开发实战 现代Web开发:Vue 3 组件化开发实战 现代Web开发:Vue 3 组…

Unity引擎智能座舱解决方案

作为全球领先的 3D 引擎之一,Unity引擎为车载3D HMI提供全栈支持。即为从概念设计到量产部署的整个 HMI 工作流程提供创意咨询、性能调优、项目开发等解决方案,从而为车载信息娱乐系统和智能驾驶座舱打造令人惊叹的交互式体验。 专为中国车企打造的HMI引…

MySQL必会知识精华6(组合WHERE子句)

我们的目标是:按照这一套资料学习下来,大家可以完成数据库增删改查的实际操作。同时轻松应对面试或者笔试题中MySQL相关题目。 上篇文章我们先做一下数据库的where条件过滤的方法,都是单个条件的过滤。本篇文章主要介绍查询的组合WHERE子句的…

[C++11] 可变参数模板

文章目录 基本语法及原理可变参数模板的基本语法参数包的两种类型可变参数模板的定义 sizeof... 运算符可变参数模板的实例化原理可变参数模板的意义 包扩展包扩展的基本概念包扩展的实现原理编译器如何展开参数包包扩展的高级应用 emplace 系列接口emplace_back 和 emplace 的…

欺诈文本分类检测(十八):基于llama.cpp+CPU推理

1. 前言 前文我们用Lora训练出自己的个性化模型后,首先面临的问题是:如何让模型在普通机器上跑起来?毕竟模型微调时都是在几十G的专用GPU上训练的,如果换到只有CPU的普通电脑上,可能会面临几秒蹦一个词的尴尬问题。 …

硬件基础06 滤波器——无源、有源(含Filter Solutions、Filter Pro、MATLAB Fdatool)

目录 一、Filter Solutions 1、软件资源及安装教程如下 2、使用相关内容 二、Filter Pro使用 1、软件资源及安装教程如下 2、使用相关内容 三、MATLAB Fdatool 1、在matlab命令中输入fdatool 2、输入相关参数,例如低通、FIR、20阶、hamming窗 3、调用 &am…

【HGT】文献精讲:Heterogeneous Graph Transformer

【HGT】文献精讲:Heterogeneous Graph Transformer 标题: Heterogeneous Graph Transformer (异构图Transformer) 作者团队: 加利福尼亚大学Yizhou Sun 摘要: 近年来,图神经网络(GN…

大厂基本功 | MySQL 三大日志 ( binlog、redo log 和 undo log ) 的作用?

前言 MySQL日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志binlog(归档日志)和事务日志redo log(重做日志)和undo log(回滚日志)…

【系统架构设计师(第2版)】五、软件工程基础知识

5.1 软件工程 20世纪60年代,为了解决软件危机,提出了软件工程的概念。 软件危机的具体表现: 软件开发进度难以预测;软件开发成本难以控制;软件功能难以满足用户期望;软件质量无法保证;软件难以…

手机内卷下一站,AI Agent

作者 | 辰纹 来源 | 洞见新研社 2024年除夕夜,OPPO在央视春晚即将开始前举办了一场“史上最短发布会”,OPPO首席产品官刘作虎宣布,“OPPO正式进入AI手机时代”。 春节假期刚过,魅族又公开表示,将停止“传统智能手机…

科研绘图系列:R语言组合堆积图(stacked plot)

文章目录 介绍加载R包数据数据预处理画图1画图2组合图形系统信息介绍 堆积图(Stacked Chart),也称为堆叠图,是一种常用的数据可视化图表,主要用于展示不同类别的数据量在总体中的分布情况。堆积图可以是柱状图、条形图或面积图的形式,其中各个类别的数据量被叠加在一起,…

Node.js 完全教程:从入门到精通

Node.js 完全教程:从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

每日一题之二叉树

已知结点元素值为正整数且值不相同的一棵二叉树。 该二叉树通过给出其先序遍历序列和中序遍历序列构造而成。 输入一个整数x,针对此二叉树编写程序求出x的右子树中所有结点值的和(若x不在树上,输出-1)。 输入说明:第一…