Apache Flink快速入门-Flink内存优化

设置Flink 的进程内存 

Apache Flink 通过严格控制其各种组件的内存使用情况,在 JVM 之上提供高效的工作负载。Flink本身开箱即用时具备为所有配置提供合理的默认值,同时也为我们用户预留了性能调优入口配置接口,Flink 允许对集群内的内存分配进行高级和细粒度的调整。

以下的内存配置适用于 TaskManager 的1.10和 JobManager 进程的1.11如果从早期版本升级 Flink,请查看本博的迁移指南文章, 因为1.101.11版本引入了许多更改

配置总内存 

Flink JVM 进程总进程内存由 Flink 应用程序消耗的内存(总 Flink 内存)和 JVM 运行进程所消耗的内存组成

在 Flink 中设置内存最简单的方法是配置以下两个选项之一:

  成分    任务管理器的选项    作业管理的选项  
Flink 总内存 taskmanager.memory.flink.size jobmanager.memory.flink.size
总进程内存 taskmanager.memory.process.size jobmanager.memory.process.size
对于本地执行,请参阅TaskManagerJobManager进程的详细信息

其余的内存组件将根据默认值或额外配置的选项自动调整。另请参阅如何为TaskManagerJobManager内存设置其他组件

配置Flink 总内存更适合独立部署 ,在这种部署中,您要声明为 Flink 本身分配了多少内存。如果您配置总进程内存,则声明应分配给 Flink JVM 进程的内存总量。对于容器化部署,它对应于请求容器的大小。

另一种设置内存的方法是配置整个 Flink 内存所需的内部组件,这些组件特定于具体的 Flink 进程

必须使用上述三种方式中的一种来配置 Flink 的内存(本地执行除外),否则 Flink 启动将失败。这意味着必须明确配置以下没有默认值的选项子集之一:

  对于任务管理器:    对于 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
不建议 同时显式配置总进程内存总 Flink 内存由于潜在的内存配置冲突,可能会导致部署失败。配置其他内存组件也需要小心,因为它可能会产生进一步的配置冲突。

JVM 参数

Flink 根据配置或派生的内存组件大小,在启动其进程时显式添加以下内存相关的 JVM 参数:

  JVM 参数    任务管理器    JobManager   
-Xmx-Xms Framework + Task Heap Memory JVM 堆内存 (*)
-XX:MaxDirectMemorySize
(总是只为 TaskManager 添加,参见JobManager 的注释)
Framework + Task Off-heap (**) + Network Memory 堆外内存 (**),(***)
-XX:MaxMetaspaceSize JVM 元空间 JVM 元空间

(*) 请记住,根据所使用的 GC 算法,您可能无法使用全部堆内存。一些 GC 算法会为自己分配一定数量的堆内存。这将导致Heap 指标返回不同的最大值
(**) 请注意,用户代码中内存的本机非直接使用也可以作为堆外内存的一部分。
(***)只有在设置了相应选项时,才会为JobManager 进程添加 JVM Direct 内存限制jobmanager.memory.enable-jvm-direct-memory-limit

另请查看TaskManager和 JobManager的详细内存模型以了解如何配置相关组件。

根据比例限制的组件

本节描述了选项的配置细节,这些选项可以是其他内存大小的一小部分,同时受最小-最大范围的约束:

  • JVM 开销可能是总进程内存的一小部分
  • 网络内存可以是Flink 总内存的一小部分(仅适用于 TaskManager)

另请查看TaskManager和 JobManager的详细内存模型以了解如何配置相关组件。

这些组件的大小总是必须在其最大值和最小值之间,否则 Flink 启动将失败。最大值和最小值具有默认值或可以通过相应的配置选项显式设置。例如,如果您只设置以下内存选项:

  • 总进程内存= 1000Mb,
  • JVM 开销最小值= 64Mb,
  • JVM 最大开销= 128Mb,
  • JVM 开销比例= 0.1

那么JVM 开销将为 1000Mb x 0.1 = 100Mb,在 64-128Mb 的范围内。

请注意,如果您配置相同的最大值和最小值,它会有效地将大小固定为该值。

如果没有明确配置组件内存,那么 Flink 会根据总内存使用分数来计算内存大小。计算值由其相应的最小/最大选项限制。例如,如果只设置了以下内存选项:

  • 总进程内存= 1000Mb,
  • JVM 开销最小值= 128Mb,
  • JVM 最大开销= 256Mb,
  • JVM 开销比例= 0.1

那么JVM开销将为128Mb,因为从比例派生的大小是100Mb,并且小于最小值。

如果定义了总内存及其其他组件的大小,也可能会忽略此开销比例在这种情况下,JVM 开销是总内存的其余部分。派生值仍必须在其最小/最大范围内,否则配置将失败。例如,假设只设置了以下内存选项:

  • 总进程内存= 1000Mb,
  • 任务堆= 100Mb,(类似的例子可以是JobManager中的JVM堆
  • JVM 开销最小值= 64Mb,
  • JVM 最大开销= 256Mb,
  • JVM 开销分数= 0.1

总进程内存的所有其他组件都有默认值,包括默认的托管内存分数(或JobManager 中的堆外内存)。那么JVM 开销就不是比例派生的值大小了 (1000Mb x 0.1 = 100Mb),而是总进程内存的其余部分,它们要么在 64-256Mb 的范围内,要么失败。

原文地址:https://www.cnblogs.com/BlogNetSpace/p/15120041.html