《Flink 内存管理》系列(已完结),共包含以下 4 篇文章:
- Flink 内存管理(一):设置 Flink 进程内存
- Flink 内存管理(二):JobManager 内存分配(含实际计算案例)
- Flink 内存管理(三):TaskManager 内存分配(理论篇)
- Flink 内存管理(四):TaskManager 内存分配(实战篇)
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
Flink 内存管理(一):设置 Flink 进程内存
Apache Flink 通过严格控制各种组件的内存使用,在 JVM 上提供高效的工作负载。虽然社区努力为所有配置提供合理的默认值,但用户在 Flink 上部署的应用程序种类繁多,这意味着这并非总是可行。为了向用户提供最大的生产价值,Flink 允许对集群内的内存分配进行高级和精细调整。
1.配置 Total Memory
Flink JVM 进程的总内存 由 Flink 应用程序消耗的内存(Total Flink Memory
)和 JVM 进程消耗的内存 组成。
在 Flink 中设置内存的最简单方法是配置以下两个选项之一:
组件 | 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 |
- 其余内存组件将根据默认值或附加配置选项自动调整。
- 配置 Flink 总内存(
Total Flink Memory
)更适合独立部署,因为在这种情况下,您需要声明给 Flink 本身分配多少内存。Flink 总内存分为 JVM 堆内存(JVM Heap
)和 堆外内存(Off-heap Memory
)。 - 如果配置总进程内存(
Total Process Memory
),则表示应为 Flink JVM 进程分配多少内存。对于容器化部署,它对应于所请求容器的大小。
另一种设置内存的方法是配置总 Flink 内存所需的内部组件,这些组件针对具体的 Flink 进程。
必须使用上述三种方法之一配置 Flink 的内存(本地执行除外),否则 Flink 启动将失败。这意味着必须明确配置以下选项子集之一,这些子集没有默认值:
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 和 taskmanager.memory.managed.size | jobmanager.memory.heap.size |
⭕ 不建议明确配置总的进程内存(
Total Process Memory
)和总的 Flink 内存(Total Flink Memory
)。这可能会因潜在的内存配置冲突而导致部署失败。配置其他内存组件也需要谨慎,因为可能会产生更多的配置冲突。
2.JVM 参数
Flink 在启动进程时,会根据配置或导出的内存组件大小,显式添加以下与内存相关的 JVM 参数。
JVM 参数 | Value for TaskManager | Value for JobManager |
---|---|---|
-Xmx and -Xms | Framework + Task Heap Memory | JVM Heap Memory (Ⅰ) |
-XX:MaxDirectMemorySize | 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.根据比例限制的组件(Capped Fractionated Components)
本节将介绍一些选项的配置细节,这些选项可以是其他内存大小的一部分,同时受到 最小 - 最大范围 的限制,例如:
JVM Overhead
可以是总进程内存的一部分。- 网络内存(
Network Memory
)可以是 Flink 总内存的一部分(仅适用于 TaskManager)。
这些组件的大小必须始终介于最大值和最小值之间,否则 Flink 启动将失败。最大值和最小值都有默认值,也可以通过相关的设置来显式设置。
total Process memory
= 1000 M B 1000MB 1000MBJVM Overhead min
= 64 M B 64MB 64MBJVM Overhead max
= 128 M B 128MB 128MBJVM Overhead fraction
= 0.1 0.1 0.1
那么 JVM Overhead 将是 1000 M B × 0.1 = 100 M B 1000MB\ ×\ 0.1 = 100MB 1000MB × 0.1=100MB,在 64 − 128 M B 64 - 128MB 64−128MB 范围内。
请注意,如果配置相同的最大值和最小值,就会有效地将大小固定为该值。
如果没有明确配置组件内存,那么 Flink 将根据总内存使用比例来计算内存大小。计算值的上限为相应的最小/最大选项。例如,如果只设置了以下内存选项:
total Process memory
= 1000 M B 1000MB 1000MBJVM Overhead min
= 128 M B 128MB 128MBJVM Overhead max
= 256 M B 256MB 256MBJVM Overhead fraction
= 0.1 0.1 0.1
那么 JVM Overhead 将为 128 M B 128MB 128MB,因为根据比例得出的大小为 100 M B 100MB 100MB,小于最小值。
如果定义了总内存及其他组件的大小,比例也可能被忽略。在这种情况下,JVM Overhead 就是总内存的其余部分。导出值仍必须在最小/最大范围内,否则配置将失败。例如,假设只设置了以下内存选项:
total Process memory
= 1000 M B 1000MB 1000MBtask heap
= 100 M B 100MB 100MBJVM Overhead min
= 64 M B 64MB 64MBJVM Overhead max
= 256 M B 256MB 256MBJVM Overhead fraction
= 0.1 0.1 0.1
进程内存总量的所有其他部分都有默认值,包括默认 Managed Memory
分数(或 JobManager 中的 Off-heap Memory
)。这样,JVM Overhead 就不是比例(
1000
M
B
×
0.1
=
100
M
B
1000MB × 0.1 = 100MB
1000MB×0.1=100MB),而是总进程内存的其余部分,要么在
64
−
256
M
B
64 - 256MB
64−256MB 范围内,要么失败。