前言
本文介绍的内存配置方法只适用于Flink 1.10及以上版本。
相关配置详细说明: Flink Config
配置 Flink 进程的内存
Flink JVM 进程的进程总内存(Total Process Memory)包含了由 Flink 应用使用的内存(Flink 总内存)以及由运行 Flink 的 JVM 使用的内存。 Flink 总内存(Total Flink Memory)包括 JVM 堆内存(Heap Memory)和堆外内存(Off-Heap Memory)。 其中堆外内存包括直接内存(Direct Memory)和本地内存(Native Memory)。

配置 Flink 进程内存最简单的方法是指定以下两个配置项中的任意一个:
| 配置项 | TaskManager 配置参数 | JobManager 配置参数 |
|---|---|---|
| Flink 总内存 | taskmanager.memory.flink.size |
jobmanager.memory.flink.size |
| 进程总内存 | taskmanager.memory.process.size |
jobmanager.memory.process.size |
配置 TaskManager 内存
Flink 的 TaskManager 负责执行用户代码。 根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用,增强作业运行的稳定性。
内存模型

如上图所示,下表中列出了 Flink TaskManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。
| 组成部分 | 配置参数 | 描述 |
|---|---|---|
Framework Heap Memory |
taskmanager.memory.framework.heap.size |
用于 Flink 框架的 JVM 堆内存(进阶配置)。 |
Task Heap Memory |
taskmanager.memory.task.heap.size |
用于 Flink 应用的算子及用户代码的 JVM 堆内存。 |
Managed memory |
taskmanager.memory.managed.size<br />taskmanager.memory.managed.fraction
|
由 Flink 管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地内存。 |
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<br />taskmanager.memory.network.max <br />taskmanager.memory.network.fraction
|
用于任务之间数据传输的直接内存(例如网络传输缓冲)。该内存部分为基于 Flink 总内存的受限的等比内存部分。 |
JVM Metaspace |
taskmanager.memory.jvm-metaspace.size |
Flink JVM 进程的 Metaspace。 |
JVM Overhead |
taskmanager.memory.jvm-overhead.min<br />taskmanager.memory.jvm-overhead.max<br />taskmanager.memory.jvm-overhead.fraction
|
用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分。 |
框架内存
通常情况下,不建议对框架堆内存和框架堆外内存进行调整。 除非你非常肯定 Flink 的内部数据结构及操作需要更多的内存。 这可能与具体的部署环境及作业结构有关,例如非常高的并发度。 此外,Flink 的部分依赖(例如 Hadoop)在某些特定的情况下也可能会需要更多的直接内存或本地内存。
内存计算
假设只配置 Total Process Memory = 2gb
Total Process Memory = Total Flink Memory +JVM Metaspace +JVM Overhead
JVM Metaspace 通过taskmanager.memory.jvm-metaspace.size配置, 默认96mb
JVM Overhead 计算:
| 配置参数 | 默认值 |
|---|---|
taskmanager.memory.jvm-overhead.min |
192mb |
taskmanager.memory.jvm-overhead.max |
1gb |
taskmanager.memory.jvm-overhead.fraction |
0.1 |
首先计算 JVM Overhead = Total Process Memory * taskmanager.memory.jvm-overhead.fraction = 2gb*0.1 = 204.8mb
如果计算出来的JVM Overhead < taskmanager.memory.jvm-overhead.min则为taskmanager.memory.jvm-overhead.min;
如果计算出来的JVM Overhead > taskmanager.memory.jvm-overhead.max则为taskmanager.memory.jvm-overhead.max;
如果计算出来的 taskmanager.memory.jvm-overhead.min <= JVM Overhead <= taskmanager.memory.jvm-overhead.max 则为JVM Overhead .
因为 192mb< 204.8mb <1gb, 所以 JVM Overhead=204.8mb
Total Flink Memory = Total Process Memory - JVM Metaspace- JVM Overhead = 2gb - 96mb - 204.8mb = 1747.2mb
Managed memory = Total Flink Memory * taskmanager.memory.managed.fraction = 1747.2mb * 0.4 = 698.88mb
Framework Off-heap Memory通过taskmanager.memory.framework.off-heap.size配置, 默认128mb
Task Off-heap Memory 默认为0byte
Network Memory 计算方式同JVM overhead
| 配置参数 | 默认值 |
|---|---|
taskmanager.memory.network.min |
64mb |
taskmanager.memory.network.max |
1gb |
taskmanager.memory.network.fraction |
0.1 |
Total Flink Memory * taskmanager.memory.network.fraction = 1747.2mb * 0.1 = 174.72mb
64mb < 174.72mb < 1gb,所以 Network Memory=174.72mb
Direct Memory = Framework Off-heap Memory + Task Off-heap Memory + Network Memory = 128mb + 0 + 174.72mb = 302.72mb
**Off Heap Memory **= Managed memory + Direct Memory = 698.88mb + 302.72mb = 1001.6mb
JVM Heap = Total Flink Memory - Off Heap Memory = 1747.2mb - 1001.6mb = 745.6mb 与web-ui显示一致
Framework Heap Memory 通过taskmanager.memory.framework.heap.size配置, 默认128mb
Task Heap 剩下的内存 JVM Heap- Framework Heap Memory = 617.6mb
配置 JobManager 内存
JobManager 是 Flink 集群的控制单元。 它由三种不同的组件组成:ResourceManager、Dispatcher 和每个正在运行作业的 JobMaster。
内存模型

如上图所示,下表中列出了 Flink JobManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。
| 组成部分 | 配置参数 | 描述 |
|---|---|---|
JVM Heap |
jobmanager.memory.heap.size |
JobManager 的 JVM 堆内存。 |
Off Heap |
jobmanager.memory.off-heap.size |
JobManager 的堆外内存(直接内存或本地内存)。 |
JVM Metaspace |
jobmanager.memory.jvm-metaspace.size |
Flink JVM 进程的 Metaspace。 |
JVM Overhead |
jobmanager.memory.jvm-overhead.min<br /> jobmanager.memory.jvm-overhead.max<br />jobmanager.memory.jvm-overhead.fraction
|
用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存 |