本文适用于 1.10 及以上版本,整理自 Flink 官网-配置 TaskManager 内存。
非本地执行
内存模型(Memory Model)
Simple Memory Model
Detailed Memory Model
配置选项(Configuration Options)
Overview
进程总内存(Total Process Memory)
taskmanager.memory.process.size = (none)
对于容器化部署模式(Containerized Deployment),这相当于申请的容器(Container)大小。
Flink 总内存(Total Flink Memory)
taskmanager.memory.flink.size = (none)
JVM Heap
框架堆内存(Framework Heap)
Flink 框架使用的(内部数据结构及操作使用的)堆内存。即 TaskManager 本身所占用的堆上内存,不计入 Slot 资源中。
taskmanager.memory.framework.heap.size = 128 mb
任务堆内存 / 任务(算子)堆内存(Task Heap / Task (Operator) Heap Memory)
Flink 应用的算子及用户代码执行所使用的堆内存。
taskmanager.memory.task.heap.size = (none)
Off-Heap Memory
托管内存(Managed Memory)
由 Flink 分配和管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地内存。
taskmanager.memory.managed.(size/fraction) = (none/0.4)
当同时指定二者时,会优先采用 size 指定的大小。若二者均未指定,会根据默认占比进行计算。
直接内存(Direct Memory)
框架堆外内存(Framework Off-Heap)
Flink 框架使用的(内部数据结构及操作使用的)堆外内存。即 TaskManager 本身所占用的堆外内存,不计入 Slot 资源中。
taskmanager.memory.framework.off-heap.size = 128 mb
任务堆外内存(Task Off-Heap)
Flink 应用的算子及用户代码执行所使用的堆外内存。
taskmanager.memory.task.off-heap.size = 0 bytes
网络内存(Network)
用于任务(task)之间数据传输的直接内存(例如网络传输缓冲区)。
taskmanager.memory.network.(min/max/fraction) = (64 mb/1 gb/0.1)
JVM Specific Memory(Off-Heap)
运行 Flink 的 JVM 使用的内存。
JVM 元空间(JVM Metaspace)
Flink JVM 进程的 Metaspace。
taskmanager.memory.jvm-metaspace.size = 256 mb
JVM 开销(JVM Overhead)
用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。
taskmanager.memory.jvm-overhead.(min/max/fraction) = (192 mb/1 gb/0.1)
JVM 参数(JVM Parameters)
Flink 进程启动时,会根据配置的和自动推导出的各内存部分大小,也可以显式地设置以下 JVM 参数:
JVM 参数 | TaskManager 取值 |
---|---|
-Xmx 和 -Xms | 框架堆内存(Framework Heap) + 任务堆内存(Task Heap) |
-XX:MaxDirectMemorySize | 框架堆外内存(Framework Off-Heap) + 任务堆外内存(Task Off-Heap) + 网络内存(Network) |
-XX:MaxMetaspaceSize | JVM 元空间(JVM Metaspace) |
建议(recommend)
不建议同时设置 进程总内存(taskmanager.memory.process.size) 和 Flink 总内存(taskmanager.memory.flink.size)。 这可能会造成内存配置冲突,从而导致部署失败。
如果已经明确设置了 任务堆内存(taskmanager.memory.task.heap.size) 和 托管内存(taskmanager.memory.managed.(size/fraction)),建议不要再设置 进程总内存(taskmanager.memory.process.size) 或 Flink 总内存(taskmanager.memory.flink.size),否则可能会造成内存配置冲突。
框架堆外内存(taskmanager.memory.framework.off-heap.size) 是一个进阶配置,建议仅在确定 Flink 框架需要更多的内存时调整该配置。
通常情况下,不建议对 框架堆内存(taskmanager.memory.framework.heap.size) 和 框架堆外内存(taskmanager.memory.framework.off-heap.size) 进行调整。 除非你非常肯定 Flink 的内部数据结构及操作需要更多的内存。
Flink 会负责管理 网络内存(taskmanager.memory.network.(min/max/fraction)),保证其实际用量不会超过配置大小。 因此,调整网络内存的大小不会对其他堆外内存有实质上的影响。
本地执行(Local Execution)
本地执行(Local Execution) 是指将 Flink 作为一个单独的 Java 程序运行在电脑本地而非创建一个集群(例如在 IDE 中)。
本地执行时,只有下列配置会生效,其他配置参数不会起到任何效果:
组成部分 | 配置参数 | 本地执行时的默认值 |
---|---|---|
任务堆内存(Task Heap) | taskmanager.memory.task.heap.size | 无穷大(Long.MAX_VALUE) |
任务堆外内存(Task Off-Heap) | taskmanager.memory.task.off-heap.size | 无穷大(Long.MAX_VALUE) |
托管内存(Managed Memory) | taskmanager.memory.managed.size | 128Mb |
网络内存(Network) | taskmanager.memory.network.(min/max) | 64Mb |
Note
本地执行模式下,任务堆内存的大小与实际的堆空间大小无关。
本地执行模式下,JVM 堆空间的实际大小不受 Flink 掌控,而是取决于本地执行进程是如何启动的。如果希望控制 JVM 的堆空间大小,可以在启动进程时明确地指定相关的 JVM 参数,即 -Xmx 和 -Xms。