Flink是基于java的JVM运行,拥有高效的数据处理能力,但是考虑到用户在 Flink 上运行的应用的多样性,尽管flink框架已经为所有配置项提供合理的默认值,仍无法满足所有情况下的需求。 为了给用户生产提供最大化的价值, Flink 允许用户在整体上以及细粒度上对集群的内存分配进行调整。(本文介绍的内存配置方法适用于 *1.11 *及以上版本)
一、flink任务的总内存
Flink JVM 进程的 进程总内存(Total Process Memory)包含了: Flink 任务和框架本身使用的内存(Total Flink Memory)和运行 Flink 的 JVM 本身使用的内存。
Flink 总内存(Total Flink Memory)包括 JVM 堆内存(Heap Memory)和堆外内存(Off-Heap Memory)。 其中堆外内存包括直接内存(Direct Memory)和本地内存(Native Memory)。
配置 Flink 进程内存最简单的方法是指定以下两个配置项中的任意一个:
配置项 TaskManager 配置参数 JobManager 配置参数 Total Flink Memorytaskmanager.memory.flink.sizejobmanager.memory.flink.sizeTotal Process Memorytaskmanager.memory.process.sizejobmanager.memory.process.size
二、TaskManager任务内存配置
**TaskManager负责执行用户代码**。 根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用,增强作业运行的稳定性。
与 JobManager 相比,TaskManager 具有相似但更加复杂的内存模型。
TaskManager内存详细模型:
如上图所示,下表中列出了 Flink TaskManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。
组成部分配置参数描述框架堆内存(Framework Heap Memory)taskmanager.memory.framework.heap.size用于 Flink 框架的 JVM 堆内存(进阶配置)任务堆内存(Task Heap Memory)taskmanager.memory.task.heap.size用于 Flink 应用的算子及用户代码的 JVM 堆内存托管内存(Managed memory)taskmanager.memory.managed.size
taskmanager.memory.managed.fraction由 Flink 管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地内存框架堆外内存(Framework Off-heap Memory)taskmanager.memory.framework.off-heap.size用于 Flink 框架的堆外内存(直接内存或本地内存)(进阶配置)任务堆外内存(Task Off-heap Memory)taskmanager.memory.task.off-heap.size用于 Flink 应用的算子及用户代码的堆外内存(直接内存或本地内存)网络内存(Network Memory)taskmanager.memory.network.min
taskmanager.memory.network.max
taskmanager.memory.network.fraction用于任务之间数据传输的直接内存(例如网络传输缓冲)。该内存部分为基于 Flink 总内存的受限的等比内存部分。这块内存被用于分配网络缓冲JVM Metaspacetaskmanager.memory.jvm-metaspace.size Flink JVM 进程的 MetaspaceJVM开销taskmanager.memory.jvm-overhead.min
taskmanager.memory.jvm-overhead.max
taskmanager.memory.jvm-overhead.fraction用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分
以上有些内存部分的大小可以直接通过一个配置参数进行设置,有些则需要根据多个参数进行调整。
通常情况下,不建议对框架堆内存和框架堆外内存进行调整。 除非非常肯定 Flink 的内部数据结构及操作需要更多的内存。 这可能与具体的部署环境及作业结构有关,例如非常高的并发度。 此外,Flink 的部分依赖(例如 Hadoop)在某些特定的情况下也可能会需要更多的直接内存或本地内存。
本地配置:
如果你是将 Flink 作为一个单独的 Java 程序运行在你的电脑本地而非创建一个集群(例如在 IDE 中),那么只有下列配置会生效,其他配置参数则不会起到任何效果:
组成部分 配置参数 本地执行时的默认值 任务堆内存taskmanager.memory.task.heap.size无穷大任务堆外内存taskmanager.memory.task.off-heap.size无穷大托管内存taskmanager.memory.managed.size128Mb网络内存
taskmanager.memory.network.min
taskmanager.memory.network.max
64Mb
三、JobManager内存配置
** JobManager 是 Flink 集群的控制单元**。 它由三种不同的组件组成:ResourceManager、Dispatcher 和每个正在运行作业的 JobMaster。
配置 JobManager 内存最简单的方法就是进程的配置总内存。本地执行模式下不需要为 JobManager 进行内存配置,配置参数将不会生效。
JobManager内存详细模型:
如上图所示,下表中列出了 Flink JobManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。
组成部分配置参数描述JVM 堆内存jobmanager.memory.heap.sizeJobManager 的 JVM 堆内存堆外内存jobmanager.memory.off-heap.size JobManager 的堆外内存(直接内存或本地内存)JVM Metaspacejobmanager.memory.jvm-metaspace.sizeFlink JVM 进程的 MetaspaceJVM 开销
jobmanager.memory.jvm-overhead.min
jobmanager.memory.jvm-overhead.max
jobmanager.memory.jvm-overhead.fraction
用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分
版权归原作者 大数据动物园 所有, 如有侵权,请联系我们删除。