学习文档:《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 内存的配置模式:
- 对于独立部署模式(Standalone Deployment),如果希望指定由 Flink 应用本身使用的内存大小,最好选择配置 Flink 总内存。
- 通过配置进程总内存可以指定由 Flink JVM 进程使用的总内存大小。 对于容器化部署模式(Containerized Deployment),这相当于申请的容器(Container)大小。
- 此外,还可以通过设置 Flink 总内存的特定内部组成部分的方式来进行内存配置。 不同进程需要设置的内存组成部分是不一样的。
在以上三种模式中,用户需要至少选择其中一种进行配置(本地运行除外),否则 Flink 将无法启动。这意味着,用户需要从以下无默认值的配置参数(或参数组合)中选择一个给出明确的配置:
TaskManagerJobManagertaskmanager.memory.flink.sizejobmanager.memory.flink.sizetaskmanager.memory.process.sizejobmanager.memory.process.sizetaskmanager.memory.task.heap.size 和 taskmanager.memory.managed.sizejobmanager.memory.heap.size
不建议同时设置进程总内存和 Flink 总内存,这可能会造成内存配置冲突,从而导致部署失败。额外配置其他内存部分时,同样需要注意可能产生的配置冲突。
JVM 参数
Flink 进程启动时,会根据配置的(或自动推导出的)各内存部分大小,显式地设置以下 JVM 参数:
JVM 参数TaskManager 的取值JobManager 的取值
-Xmx
和
-Xms
框架堆内存 + 任务堆内存JVM 堆内存(因为一些 GC 算法会为自身分配一定量的堆内存,所以可能导致无法用到全部的堆内存)
-XX:MaxDirectMemorySize
框架堆外内存 + 任务堆外内存(堆外内存也包括了用户代码使用的本地内存) + 网络内存堆外内存(堆外内存也包括了用户代码使用的本地内存;只有在
jobmanager.memory.enable-jvm-direct-memory-limit
设置为
true
时,JobManager 才会设置这个参数)
-XX:MaxMetaspaceSize
JVM MetaspaceJVM Metaspace
受限的等比内存部分
下列内存部分都可以通过指定在总内存中所占比例的方式进行配置,同时受限于相应的的最大/最小值范围。通过推导逻辑得出的内存必须在最小值、最大值的范围内,否则 Flink 会启动失败。最小值、最大值具有默认值,但也可以通过相应的配置参数进行设置:
- JVM 开销:可以配置占用进程总内存的固定比例
- 网络内存:可以配置占用 Flink 总内存的固定比例(仅针对 TaskManager)
示例:通过以下配置,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 将会启动失败。
版权归原作者 长行 所有, 如有侵权,请联系我们删除。