【大数据】Flink 内存管理(三):TaskManager 内存分配(理论篇)

2024-02-25 16:20

本文主要是介绍【大数据】Flink 内存管理(三):TaskManager 内存分配(理论篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Flink 内存管理》系列(已完结),共包含以下 4 篇文章:

  • Flink 内存管理(一):设置 Flink 进程内存
  • Flink 内存管理(二):JobManager 内存分配(含实际计算案例)
  • Flink 内存管理(三):TaskManager 内存分配(理论篇)
  • Flink 内存管理(四):TaskManager 内存分配(实战篇)

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Flink 内存管理(三):TaskManager 内存分配

  • 1.配置 Total Memory
  • 2.配置 Heap and Managed Memory
    • 2.1 Task (Operator) Heap Memory
    • 2.2 Managed Memory
  • 3.配置 Off-Heap Memory(Direct or Native)
  • 4.详细内存模型
  • 5.Framework Memory
  • 6.Local Execution

TaskManager 在 Flink 中运行用户代码。根据需要配置内存使用量可大大减少 Flink 的资源占用并提高任务稳定性。与 JobManager 进程的内存模型相比,TaskManager 内存组件具有类似但更复杂的结构。

1.配置 Total Memory

Flink JVM 进程的总内存(Total Process Memory)由 Flink 应用程序(Total Flink Memory,Flink 总内存)和 JVM 运行进程所消耗的内存组成。Flink 总内存( Total Flink Memory)包括 JVM HeapManaged Memory(托管内存,由 Flink 管理)和其他 Direct Memory(或 Native Memory)的使用量。
在这里插入图片描述

  • 如果您在本地运行 Flink(例如从集成开发环境运行)而不创建集群,那么只有内存配置选项的一个子集与之相关,请参阅 “本地内存配置”。
  • 否则,为 TaskManager 设置内存的最简单方法就是 配置总内存。这里 将详细介绍一种更精细的方法。
  • 其余内存组件将根据默认值或附加配置选项自动调整。有关其他内存组件的更多详情,请参阅后续章节。

2.配置 Heap and Managed Memory

正如之前在总内存描述中提到的,在 Flink 中设置内存的另一种方法是明确指定 Task Heap MemoryManaged Memory。这样,Flink 的任务和托管内存就能更好地控制可用的 JVM 堆。

其余的内存组件将自动调整。

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

2.1 Task (Operator) Heap Memory

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

2.2 Managed Memory

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

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

托管内存的大小可以:

  • 可通过 taskmanager.memory.managed.size 进行显式配置。
  • 或通过 taskmanager.memory.managed.fraction 计算为 Flink 总内存(Total Flink Memory)的一部分。

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

如果作业包含多种类型的托管内存消费者,还可以控制托管内存在这些类型之间的共享方式。配置选项 taskmanager.memory.managed.consumer-weights 允许你为每种类型设置一个权重,Flink 将根据该权重按比例预留托管内存。有效的消费者类型有:

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

例如,如果一个流作业同时使用了 RocksDB 状态后端和 Python UDF,且消费者权重配置为 STATE_BACKEND:70,PYTHON:30,那么 Flink 将为该作业预留 70 % 70\% 70% 的内存。

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

🚀 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(默认 128 M 128M 128M专用于运行 Flink 框架,通常不用修改该值,它可能与特定的部署环境或作业结构有关,例如高并行度
Task Heap Memorytaskmanager.memory.task.heap.size专用于用户提交作业划分的 Tasks
Managed Memorytaskmanager.memory.managed.size taskmanager.memory.managed.fraction(默认 0.4 0.4 0.4这是一块被 Flink 管理的堆外内存,属于 Native Memory,用于批处理作业的排序,Hash 运算,缓存中间结果,以及 RocksDB 状态后端的元数据
Framework Off-Heap Memorytaskmanager.memory.framework.off-heap.size(默认 128 M 128M 128M专用于运行 Flink 框架,通常不用修改该值,它可能与特定的部署环境或作业结构有关,例如高并行度
Task Off-Heap Memorytaskmanager.memory.task.off-heap.size(默认 0 B y t e 0Byte 0Byte专用于用户提交作业划分的 Tasks,不受 GC 的影响
Network Memorytaskmanager.memory.network.min (默认 64 M B 64MB 64MBtaskmanager.memory.network.max (默认 1 G B 1GB 1GBtaskmanager.memory.network.fraction(默认 0.1 0.1 0.1为 Task 之间的数据交换预留的内存,比如说网络缓冲区,默认是 Total Flink Size 的 0.1,通常不需要去调整这个值
JVM Metaspacetaskmanager.memory.jvm-metaspace.size(默认 256 M 256M 256MJM 的元空间大小,有默认值 256 M 256M 256M, 属于 Native Memory
JVM Overheadtaskmanager.memory.jvm-overhead.min 192 M B 192MB 192MBtaskmanager.memory.jvm-overhead.max 1 G B 1GB 1GBtaskmanager.memory.jvm-overhead.fraction 0.1 0.1 0.1为 Thread Stacks,Code Cache,Garbage Collection Space 预留的 Native Memory,有默认的 faction of total process size,但是必须在其 min & max 之间

正如你所看到的,某些内存组件的大小可以通过相应选项进行简单设置。其他组件则可以使用多个选项进行调整。

5.Framework Memory

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

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

6.Local Execution

如果您在机器上以单个 Java 程序的形式本地启动 Flink,而不创建集群(例如从集成开发环境),那么除了以下组件外,所有组件都将被忽略:

内存组件
相关选项
本地执行的默认值
Task Heaptaskmanager.memory.task.heap.size无限
Task Off-Heaptaskmanager.memory.task.off-heap.size无限
Managed Memorytaskmanager.memory.managed.size 128 M B 128MB 128MB
Network Memorytaskmanager.memory.network.min
taskmanager.memory.network.max
64 M B 64MB 64MB

上面列出的所有组件均可配置为本地执行,但并非必须。如果没有配置,它们将被设置为默认值。任务堆内存(Task Heap)和任务堆外内存(Task Off-Heap)被视为无限大(Long.MAX_VALUE 字节),托管内存(Managed Memory)的默认值为 128MB,仅适用于本地执行模式。

在这种情况下,任务堆大小与实际堆大小没有任何关系。它可能与未来版本的优化有关。Flink 无法控制已启动的本地进程的实际 JVM 堆大小,这取决于您如何启动进程。如果要控制 JVM 堆大小,必须明确传递相应的 JVM 参数,例如 -Xmx-Xms

这篇关于【大数据】Flink 内存管理(三):TaskManager 内存分配(理论篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查