Flink内存模型
此图是基于flink1.12版本.
一个taskmanager给了6g内存,可以有很清楚的看到各个部分占用的内存,还是实时变化的.
名词解释
组件 | 配置项 | 描述 |
---|---|---|
Framework Heap Memory | taskmanager.memory.framework.heap.size | (高级参数,一般不需要用户配置)分配给 Flink 框架的 JVM 堆内存(默认128MB) |
Task Heap Memory | taskmanager.memory.task.heap.size | 分配给 operator 和用户代码的 JVM 堆内存 |
Managed memory | taskmanager.memory.managed.size(默认none) taskmanager.memory.managed.fraction(默认0.4) | 被 flink 管理的本地内存,用于 batch 作业的中间结果排序(sort)、散列表(hash)、缓存(caching )和 Streaming 作业的 RocksDB state backend |
Framework Off-heap Memory | taskmanager.memory.framework.off-heap.size(默认128 mb) | (高级参数)分配给 Flink 框架的 Off-heap direct 内存 |
Task Off-heap Memory | taskmanager.memory.task.off-heap.size | 分配给 task operator 的 Off-heap direct 内存,默认(0 bytes) |
Network Memory | taskmanager.memory.network.min(默认64 mb) taskmanager.memory.network.max(默认1 gb) taskmanager.memory.network.fraction(默认0.1) | 为 tasks 之间的数据元素交换保留的 Off-heap direct(例如,通过网络进行传输的缓冲区),它是 Total Flink Memory 的一个有上下限的细分组件 |
JVM metaspace | taskmanager.memory.jvm-metaspace.size(默认96 mb) flink-1.10.0 为 96 mb flink-1.10.1及flink-1.11为256 mb 更改原因见 FLINK-16406 | Flink JVM 进程的元数据空间大小,为本地内存 |
JVM Overhead | taskmanager.memory.jvm-overhead.min(默认192 mb) taskmanager.memory.jvm-overhead.max(默认1 gb) taskmanager.memory.jvm-overhead.fraction(默认0.1) | 为 JVM 进程预留的其他本地内存,用于线程栈、代码缓存、垃圾收集。它是 Total Process Memory(整个进程) 的一个有上下限的细分组件 |
如您所见,某些内存组件的大小可以通过相应的选项简单地设置。其他组件可以使用多个选项进行调优。
中文名
- 堆内存
- 框架堆内存(Framework Heap Memory):用于 Flink 框架的 JVM 堆内存(进阶配置)。
- 任务堆内存(Task Heap Memory):用于 Flink 应用的算子及用户代码的 JVM 堆内存。
- 堆外内存
- 托管内存(Managed memory):由 Flink 管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地内存。
- 框架堆外内存(Framework Off-heap Memory):用于 Flink 框架的堆外内存(直接内存或本地内存)(进阶配置)。
- 任务堆外内存(Task Off-heap Memory):用于 Flink 应用的算计及用户代码的堆外内存(直接内存或本地内存)。
- 网络内存(Network Memory):用于任务之间数据传输的直接内存(例如网络传输缓冲)。该内存部分为基于 Flink 总内存的受限的等比内存部分。
内存溢出发生在 Framework Heap Memory
由于我的程序内存溢出Framework Heap Memory 满了,但是 Managed memory还有很多空余的,我这边的计算并不多, 我就把Managed memory 调小了,配置文件中taskmanager.memory.managed.size: 1g