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

news2024/11/25 14:58:14

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.coloradmin.cn/o/2232381.html

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

相关文章

配置DDNS结合光猫路由器实现外网映射

配置ddns结合光猫路由器实现外网映射 一、实现思路 首先需要去获取一个动态域名(文章不再赘述,重点去介绍具体实现),用作后面与与公网绑定。然后需要在光猫和路由器上去做配置,同时确保路由器有公网IP,最…

如何在BSV区块链上实现可验证AI

​​发表时间:2024年10月2日 nChain的顶尖专家们已经找到并成功测试了一种方法:通过区块链技术来验证AI(人工智能)系统的输出结果。这种方法可以确保AI模型既按照规范运行,避免严重错误,遵守诸如公平、透明…

华为HarmonyOS打造开放、合规的广告生态 - 激励广告

场景介绍 激励广告是一种全屏幕的视频广告,用户可以选择点击观看,以换取相应奖励。 接口说明 接口名 描述 loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void 请求单广告位广告,通过AdRequestPar…

easyui +vue v-slot 注意事项

https://www.jeasyui.com/demo-vue/main/index.php?pluginDataGrid&themematerial-teal&dirltr&pitemCheckBox%20Selection&sortasc 接口说明 <template><div><h2>Checkbox Selection</h2><DataGrid :data"data" style&…

unity搭建场景学习

unity搭建场景学习 创建场景创建gameobject创建材质&#xff0c;用于给gameobject上色拖拽材质球上色上色原理设置多个材质方式设置贴图的方式 效果设置光滑度一些预览设置菜单渲染模型与碰撞模型网格渲染参数1. materials(材质)2. lighting(光照)3. reflection probes(反射探针…

软件加密与授权管理:构建安全高效的软件使用体系

“软件加密与授权管理&#xff1a;构建安全高效的软件使用体系”是一个全面且深入的议题&#xff0c;以下是对该议题的详细探讨&#xff1a; 一、软件加密的概念与重要性 软件加密是指为软件添加保护措施&#xff0c;以防止其被盗版或非法复制。这一技术站在软件开发者的角度&a…

【VScode】中文版ChatGPT编程工具-CodeMoss!教程+示例+快捷键

文章目录 1. 多模型选择2. 编辑快捷键3. 历史记录收藏 CodeMoss使用教程1. 安装CodeMoss插件2. 配置AI模型3. 使用快捷键4. 进行代码优化与解释5. 收藏历史记录 总结与展望 在当今快速发展的编程世界中&#xff0c;开发者们面临着越来越多的挑战。如何提高编程效率&#xff0c;…

宝塔Linux面板安装PHP扩展失败报wget: unable to resolve host address ‘download.bt.cn’

一、问题&#xff1a; 当使用宝塔面板安装PHP扩展失败出现如下错误时 Resolving download.bt.cn(download.bt.cn)...failed: Connection timed out. wget: unable toresolve host address download.bt.cn’ 二、解决&#xff1a; 第一步&#xff1a;如下命令执行拿到返回的I…

Scrapy源码解析:DownloadHandlers设计与解析

1、源码解析 代码路径&#xff1a;scrapy/core/downloader/__init__.py 详细代码解析&#xff0c;请看代码注释 """Download handlers for different schemes"""import logging from typing import TYPE_CHECKING, Any, Callable, Dict, Gener…

【C++】对左值引用右值引用的深入理解(右值引用与移动语义)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 ​ 目录 前言&#xff1a;对引用的底层理解 一、左值与右值 提问&#xff1a;左值在左&#xff0c;右值在右&#xff1f;…

docker下迁移elasticsearch的问题与解决方案

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 docker下迁移elasticsearch的问题与解决方案 数据挂载报错解决权限问题节点故障 直接上图&#x…

1.3 初探OpenCV贡献库

OpenCV贡献库&#xff08;opencv_contrib&#xff09;是OpenCV的一个扩展库&#xff0c;由社区开发&#xff0c;包含更多视觉应用和受专利保护的算法。它提供最新研究算法、扩展功能和社区支持。可以通过pip安装或手动编译。

太空旅游:科技能否让星辰大海变为现实?

内容概要 在这个快速变化的时代&#xff0c;太空旅游成为了一个让人热血沸腾的话题。想象一下&#xff0c;坐在一颗漂浮的太空舱里&#xff0c;手中端着饮料&#xff0c;眺望着无尽的星辰大海&#xff0c;简直就像科幻电影中的情节一样。不过&#xff0c;这不仅仅是一个空洞的…

智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3【性能篇】

本系列文章记录“智能提醒助理”产品建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍技术栈升级后的切换方案以及性能提升。 一、需求出发点 智能提醒小程序 当前使用的是jdk8&#xff0c;springboot2.3,升级到jdk21和springboot3.3 学习新知识的同时…

ROS2入门学习——ROS在机器人中的运行

一、入门级基础平台TurtleBot TurtleBot 是 ROS 中重要且资源丰富的机器人之一&#xff0c;特别适合入门级机器人爱好者提供基础平台。用户可以直接利用其自带的软硬件&#xff0c;专注于应用程序的开发。TurtleBot 随着 ROS 的发展&#xff0c;一直处于开发前沿。 TurtleBot…

cuda、pytorch-gpu安装踩坑!!!

前提&#xff1a;已经安装了acanoda cuda11.6下载 直接搜索cuda11.6 acanoda操作 python版本3.9 conda create -n pytorch python3.9conda activate pytorch安装Pytorch-gpu版本等包 要使用pip安装&#xff0c;cu116cuda11.6版本 pip install torch1.13.1cu116 torchvi…

二分法查找(c基础)

二分法查找一个有序数组中是否有某个数 大家看了可以自己写一下 &#xff08; 要用知识点 数组 while循环 scanf 函数 printf函数 &#xff09; //用二分法查找 #include<stdio.h> int main() {char arr[] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof(arr) / size…

实现图书管理系统

1. 图书管理系统菜单 如上图给用户选项 1. 管理员 2. 普通用户 2. 实现基本框架 右键点src&#xff0c;选择new&#xff0c;选择Package命名三个包 book operation user 1.先选择book包&#xff0c;new两个类 book bookList 在book类中定义书的基本属性&#xff0c;并重写…

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记 这是新国立和新加坡管理大学发表在ECCV2024上的一篇image restoration的文章&#xff0c;提出了一个新的网络结构ECMA&#xff0c;从实验结果上看在超分&#xff0c;去噪&#xff0c;去模糊…

不需要复制粘贴,重复内容如何使用Mac快速完成输入

在Mac的日常使用中&#xff0c;必然有着重复内容需要重复输入的需求&#xff0c;但是Mac的剪切板又不具备历史记录的功能&#xff0c;所以只能一次次的复制粘贴&#xff0c;费时费力&#xff0c;那么该如何才能不这么麻烦 快捷短语就是为了解决这一问题而存在的 提前在设置好…