前言
本文介绍的内存配置方法只适用于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 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存 |