学习文档:《Flink 官方文档 - 部署 - 内存配置 - 配置 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 |
Flink 会根据默认值或其他配置参数自动调整剩余内存部分的大小。
Flink 内存的配置模式:
在以上三种模式中,用户需要至少选择其中一种进行配置(本地运行除外),否则 Flink 将无法启动。这意味着,用户需要从以下无默认值的配置参数(或参数组合)中选择一个给出明确的配置:
不建议同时设置进程总内存和 Flink 总内存,这可能会造成内存配置冲突,从而导致部署失败。额外配置其他内存部分时,同样需要注意可能产生的配置冲突。
Flink 进程启动时,会根据配置的(或自动推导出的)各内存部分大小,显式地设置以下 JVM 参数:
JVM 参数 | TaskManager 的取值 | JobManager 的取值 |
---|---|---|
-Xmx 和 -Xms | 框架堆内存 + 任务堆内存 | JVM 堆内存(因为一些 GC 算法会为自身分配一定量的堆内存,所以可能导致无法用到全部的堆内存) |
-XX:MaxDirectMemorySize | 框架堆外内存 + 任务堆外内存(堆外内存也包括了用户代码使用的本地内存) + 网络内存 | 堆外内存(堆外内存也包括了用户代码使用的本地内存;只有在 jobmanager.memory.enable-jvm-direct-memory-limit 设置为 true 时,JobManager 才会设置这个参数) |
-XX:MaxMetaspaceSize | JVM Metaspace | JVM Metaspace |
下列内存部分都可以通过指定在总内存中所占比例的方式进行配置,同时受限于相应的的最大/最小值范围。通过推导逻辑得出的内存必须在最小值、最大值的范围内,否则 Flink 会启动失败。最小值、最大值具有默认值,但也可以通过相应的配置参数进行设置:
示例:通过以下配置,JVM 开销的实际大小将会是 1000MB x 0.1 = 100MB,在 64 - 128 MB 的范围内
total Process memory
= 1000MB(进程总内存)JVM Overhead min
= 64MB(JVM 开销最小值)JVM Overhead max
= 128MB(JVM 开销最大值)JVM Overhead fraction
= 0.1(JVM 开销占进程总内存的比例)
如果将最大值、最小值设置成相同大小,那相当于明确指定了该内存部分的大小。
如果没有明确指定内存部分的大小,Flink 会根据总内存和占比计算出该内存部分的大小。计算得到的内存大小将受限于相应的最大值、最小值范围。
示例:通过以下配置,JVM 开销的实际大小将会是 128 MB,因为根据进程总内存和占比计算得到的内存大小 100MB 小于最小值
total Process memory
= 1000MB(进程总内存)JVM Overhead min
= 128MB(JVM 开销最小值)JVM Overhead max
= 256MB(JVM 开销最大值)JVM Overhead fraction
= 0.1(JVM 开销占进程总内存的比例)
如果配置了总内存和其他内存部分的大小,那么 Flink 也有可能会忽略给定的占比。这种情况下,受限的等比内存部分的实际大小是总内存减去其他所有内存部分后剩余的部分。这样推导得出的内存大小必须符合最大值、最小值范围,否则 Flink 将无法启动。
示例:
total Process memory
= 1000MB(进程总内存)task heap
= 100MB(任务堆内存,类似于 JobManager 的 JVM 堆内存)JVM Overhead min
= 64MB(JVM 开销最小值)JVM Overhead max
= 256MB(JVM 开销最大值)JVM Overhead fraction
= 0.1(JVM 开销占进程总内存的比例)因为进程总内存中所有其他内存部分均有默认大小,所以 JVM 开销的实际大小不是根据占比算出的 100MB,而是进程总内存中剩余的部分。这个剩余部分的大小必须在 64 - 256 MB 的范围内,否则 Flink 将会启动失败。