Apache Flink快速入门-Flink内存优化
设置Flink 的进程内存
Apache Flink 通过严格控制其各种组件的内存使用情况,在 JVM 之上提供高效的工作负载。Flink本身开箱即用时具备为所有配置提供合理的默认值,同时也为我们用户预留了性能调优入口配置接口,Flink 允许对集群内的内存分配进行高级和细粒度的调整。
以下的内存配置适用于 TaskManager 的1.10版和 JobManager 进程的1.11版。如果从早期版本升级 Flink,请查看本博的迁移指南文章, 因为1.10和1.11版本引入了许多更改。
配置总内存
Flink JVM 进程的总进程内存由 Flink 应用程序消耗的内存(总 Flink 内存)和 JVM 运行进程所消耗的内存组成。
在 Flink 中设置内存最简单的方法是配置以下两个选项之一:
成分 | 任务管理器的选项 | 作业管理的选项 |
---|---|---|
Flink 总内存 | taskmanager.memory.flink.size |
jobmanager.memory.flink.size |
总进程内存 | taskmanager.memory.process.size |
jobmanager.memory.process.size |
对于本地执行,请参阅TaskManager和JobManager进程的详细信息。
其余的内存组件将根据默认值或额外配置的选项自动调整。另请参阅如何为TaskManager和JobManager内存设置其他组件。
配置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 的范围内,要么失败。