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