flink 内存配置(一):设置Flink进程内存
flink 内存配置(一):设置Flink进程内存
flink 内存配置(二):设置TaskManager内存
flink 内存配置(三):设置JobManager内存
flink 内存配置(四):内存调优和问题处理
Apache Flink通过严格控制各个组件的内存使用,在JVM之上提供了高效的工作负载。虽然Flink社区努力为所有配置提供合理的默认值,但由于用户部署在Flink上的应用范围很广,这并不总是可行的。为了给用户提供最大的生产价值,Flink支持对集群内的内存分配进行高层和细粒度的调优。
下面进一步描述的内存配置适用于1.10版本之后的TaskManager进程和1.11版本之后的JobManager进程。
1. 配置 Total Memory
Flink JVM进程的总进程内存(Total Process Memory)由Flink应用程序消耗的内存(Flink总内存即Total Flink Memory)和运行该进程的JVM消耗的内存组成。Flink总内存消耗包括JVM堆和非堆(直接内存或本地内存)内存的使用。如下图:
在Flink中设置内存最简单的方法是配置以下两个选项中的一个:
Component | Option for TaskManager | Option for JobManager |
Total Flink memory | taskmanager.memory.flink.size | jobmanager.memory.flink.size |
Total process memory | taskmanager.memory.process.size | jobmanager.memory.process.size |
其余的内存组件将根据默认值或额外配置的选项自动调整。请参阅后面章节如何设置TaskManager和JobManager内存的其他组件。
对于本来就需要声明给Flink占用多少内存的standalone deployments部署方式来说,配置Flink总内存更合适。Flink总内存分为JVM堆内存和堆外内存。原因在于:总进程内存无关紧要,因为它也不会受控于yarn或k8s。
而对于容器化部署方式(yarn或k8s)来说,配置Flink JVM进程的总进程内存是更合适,他的大小对应于容器(container)的大小。
设置内存的另一种方法是配置Flink总内存里的各个具体组件的内存大小。具体配置见 flink 内存配置(二)和flink 内存配置(三).
上面一共说了3种配置方法:1是配置Total process memory;2是配置Total Flink memory;3是具体配置 Total Flink memory里各个组件的具体内存大小。即如下,必须显式的配置以上三种里的一种,不然flink就会启动失败。当然也不建议同时配置Total process memory和Total Flink memory,容易引发内存配置的冲突,而导致启动失败,配置其他内存组件也需要谨慎,因为它可能产生进一步的配置冲突。
for TaskManager: | for JobManager: |
taskmanager.memory.flink.size | jobmanager.memory.flink.size |
taskmanager.memory.process.size | jobmanager.memory.process.size |
taskmanager.memory.task.heap.size and taskmanager.memory.managed.size | jobmanager.memory.heap.size |
2. JVM参数
flink提供了以下jvm参数配置:
JVM Arguments | Value for TaskManager | Value for JobManager |
-Xmx and -Xms | Framework + Task Heap Memory | JVM Heap Memory (*) |
-XX:MaxDirectMemorySize (always added only for TaskManager, see note for JobManager) | Framework + Task Off-heap (**) + Network Memory | Off-heap Memory (**),(***) |
-XX:MaxMetaspaceSize | JVM Metaspace | JVM Metaspace |
说明:
(*)请记住,根据所使用的GC算法,您可能无法使用全部堆内存。有些GC算法会为自己分配一定数量的堆内存。这将导致堆监控指标返回不同的最大值。
(**)请注意,用户代码中的本地非直接内存使用也可以作为堆外内存的一部分。
(***)只有设置了相应的 jobmanager.memory.enable-jvm-direct-memory-limit 选项,才会为 JobManager 进程添加 JVM 直接内存限制。
3. 有比例限制的组件
本节将介绍一些选项的配置细节,这些选项可以是其他内存大小的一部分比值(即乘以fraction参数),同时受到 最小 - 最大范围 的限制,例如:
- JVM Overhead 可以是总进程内存的一部分。
- Network Memory可以是 Flink 总内存的一部分(仅适用于 TaskManager)。
这些组件的大小必须在最大值和最小值之间,否则Flink启动将失败。最大值和最小值有默认值,或者可以通过相应的配置选项显式设置。例如,如果你只设置以下内存选项:
- total Process memory = 1000MB,
- JVM Overhead min = 64MB,
- JVM Overhead max = 128MB,
- JVM Overhead fraction = 0.1
然后JVM Overhead值就是 1000MB x 0.1 = 100MB, 在64-128MB范围之间。
注意,如果你配置相同的最大值和最小值,它会有效地固定大小为该值。
如果不显式配置组件内存,Flink会根据总内存计算出内存大小。计算值由相应的min/max选项限制。例如,如果只设置了以下内存选项:
- total Process memory = 1000MB,
- JVM Overhead min = 128MB,
- JVM Overhead max = 256MB,
- JVM Overhead fraction = 0.1
那么 JVM Overhead 将是128MB,因为由fraction比例得出的大小是100MB,小于最小值。
如果总内存及其其他组成部分的大小已经定义,那么这个比例也可能被忽略。在这种情况下,JVM Overhead就是总内存的剩余部分。派生值仍然必须在其最小/最大范围内,否则配置将失败。例如,假设只设置了以下内存选项。
- total Process memory = 1000MB,
- task heap = 100MB, (similar example can be for JVM Heap in the JobManager)
- JVM Overhead min = 64MB,
- JVM Overhead max = 256MB,
- JVM Overhead fraction = 0.1
进程总内存的所有其他组件都有默认值,包括默认 Managed Memory 分数(或 JobManager 中的 Off-heap Memory)。那么JVM Overhead 不是这个部分(1000MB x 0.1 = 100MB),而是整个进程内存的剩余部分,这些部分要么在64-256MB范围内,要么失败。
参考网址:
https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/deployment/memory/mem_setup/