flink 内存配置(一):设置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/

相关推荐
二进制_博客31 分钟前
Flink学习连载第二篇-使用flink编写WordCount(多种情况演示)
大数据
hong1616881 小时前
大数据技术Kafka详解:消息队列(Messages Queue)
大数据·分布式·kafka
隔着天花板看星星10 小时前
Kafka-创建topic源码
大数据·分布式·中间件·kafka
goTsHgo10 小时前
在Spark Streaming中简单实现实时用户画像系统
大数据·分布式·spark
老周聊架构11 小时前
聊聊Flink:Flink中的时间语义和Watermark详解
大数据·flink
high201111 小时前
【Apache Paimon】-- 5 -- Flink 向 Paimon 表写入数据
linux·flink·apache·paimon
别这么骄傲11 小时前
Flink Lookup Join(维表 Join)
大数据·flink·linq
Mephisto.java11 小时前
【大数据学习 | flume】flume Sink Processors与拦截器Interceptor
大数据·sql·oracle·sqlite·json·flume
PersistJiao12 小时前
Spark RDD(弹性分布式数据集)的深度理解
大数据·分布式·spark·rdd
AIBigModel12 小时前
o1的风又吹到多模态,直接吹翻了GPT-4o-mini
大数据·人工智能·算法