【大数据】Flink 内存管理(一):设置 Flink 进程内存

  • [1.配置 Total Memory](#1.配置 Total Memory)
  • [2.JVM 参数](#2.JVM 参数)
  • [3.根据比例限制的组件(Capped Fractionated Components)](#3.根据比例限制的组件(Capped Fractionated Components))

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.sizetaskmanager.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 1000MB
  • JVM Overhead min = 64 M B 64MB 64MB
  • JVM Overhead max = 128 M B 128MB 128MB
  • JVM 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 1000MB
  • JVM Overhead min = 128 M B 128MB 128MB
  • JVM Overhead max = 256 M B 256MB 256MB
  • JVM 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 1000MB
  • task heap = 100 M B 100MB 100MB
  • JVM Overhead min = 64 M B 64MB 64MB
  • JVM Overhead max = 256 M B 256MB 256MB
  • JVM 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 范围内,要么失败。

相关推荐
AI08018 分钟前
模型上线只是开始:AI可观测性如何成为企业AI治理的必选项
大数据·人工智能
imbackneverdie1 小时前
撰写系统性综述/叙述性综述,如何搭建清晰的领域发展脉络?
大数据·人工智能·aigc·论文·科研·ai写作·学术
2601_963282771 小时前
寒地专网通信实战:对讲机技术选型、组网优化与东北多行业落地全指南
大数据·数据库·人工智能
广凌股份(广凌科技)1 小时前
广凌智慧大内控一体化平台:告别纸上内控,把握真实运行状态
大数据·人工智能
禾高网络1 小时前
开启环保新潮流:回收小程序系统功能介绍
java·大数据·小程序
于壮士hoho2 小时前
BA|如何解决指标口径不一致问题?
大数据
7177772 小时前
合规与效能双升级:Gitee Team 构建关键行业软件工厂的实践方法
大数据·gitee
INNOVIX稳石机器人2 小时前
从“存得下”到“管得活”:稳石四向穿梭车如何重塑密集仓储新逻辑?
大数据·运维
孙启超2 小时前
【AI应用开发】怎么降低 Agent 幻觉?有几种可行方案?
大数据·人工智能·llm·agent·rag·幻觉·ai应用开发