一、简介
JobManager 具有许多与协调 Flink 应用程序的分布式执行有关的职责:它决定何时调度下一个 task(或一组 task)、对完成的 task 或执行失败做出反应、协调 checkpoint、并且协调从失败中恢复等等。这个进程由三个不同的组件组成ResourceManager、Dispatcher、JobMaster。需对JobManager 内存详细了解,以及内存在整体上以及细粒度上的配置方法。
二、JobManager 内存模型简介

参数设置:
- jobmanager.memory.process.size:对应到图中的 Total Process Memory 。对应到 -yjm。
- jobmanager.memory.flink.size:对应到图中的Total Flink Memory,作业管理器的总Flink内存大小。这包括JobManager消耗的所有内存,除了JVM元空间和JVM开销,它由JVM堆内存和堆外内存组成。
- jobmanager.memory.heap.size :对应到图中的JVM Head:JobManager的JVM堆内存大小。
- jobmanager.memory.off-heap.size:默认值:128mb,对应到图中的Off-Heap Memory。JobManager的堆外内存。
- jobmanager.memory.jvm-metaspace.size:默认值:256mb ,对应到图中的JVM Metaspace。JobManager JVM 进程的 Metaspace。
- JVM Overhead,是用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等,JVM开销的大小是为了弥补总进程内存中配置的部分。
- jobmanager.memory.jvm-overhead.fraction:默认值 0.1(Total Process Memory的0.1)。
- jobmanager.memory.jvm-overhead.min:默认值192mb
- jobmanager.memory.jvm-overhead.max:默认值1gb
- 按照比例算,如果内存大小小于或大于配置的最小或最大大小,则将使用最小或最大大小。可以通过将最小和最大大小设置为相同的值,可以显式指定JVM开销的确切大小。
那么如果设置了 -yjm 1024 ,JobManager的JVM的堆内存大小是多少呢?
首先,在没有显示的设置其它内存的情况下,所有的内存组成部分都用默认值
- JVM Metaspace:256mb
- JVM Overhead:1024 * 0.1 = 102.4 由于102.4 < 192 所以JVM Overhead的大小为192mb
- Total Flink Memory:1024 - 256 - 192 = 576
- Off-Heap Memory:128mb
- JVM Overhead:576 - 128 = 448mb
有点时候,我们会希望运用到JVM Head的内存更多一点,那么就可以尝试着把其它的部分调低,来给到JVM Head更多的内存。
Flink JobManager 内存模型相关配置参数说明。
| 组成部分 | 配置参数 | 描述 |
| JVM 堆内存 | jobmanager.memory.heap.size | JVM 堆内存 |
| 堆外内存 | jobmanager.memory.off-heap.size | JobManager 的堆外内存(直接内存或本地内存)默认值:128MB |
| JVM Metaspace | jobmanager.memory.jvm-metaspace.size | Flink JVM 进程的 Metaspace 默认值256mb |
| JVM 开销 | jobmanager.memory.jvm-overhead.min jobmanager.memory.jvm-overhead.max jobmanager.memory.jvm-overhead.fraction | 用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分 |
三、JobManager 内存运用场景
- Flink 框架
- 在作业提交时(例如一些特殊的批处理 Source)及 Checkpoint 完成的回调函数中执行的用户代码
程序运行指定jobmanager内存,参数配置 -Djobmanager.memory.process.size=8g,页面实际分配,刚好8g
