Flink 内存模型

发布时间:2026/5/31 21:42:20

Flink 内存模型 在大数据中所有开源计算框架都会使用到JVM 例如MapReduce、Storm、Spark等这些计算框架在处理数据过程中涉及到将大量数据存储在内存中此时如果内存管理过渡依赖JVM就会出现java对象存储密度低导致内存使用率低以及垃圾回收导致系统不稳定问题这极大影响了系统的性能和稳定性。Flink也是计算框架计算过程中同样也是基于JVM但是Flink实现了内存管理即脱离JVM对内存进行管理统一且有效地管理堆内存和堆外内存确保大规模数据处理不会因为GC等问题造成系统不稳定。Flink1.10版本后为了满足更细粒度以及灵活的内存管理,升级了内存模型对内存组成进行了比较大的调整由于在Flink中计算主要存在于TaskManager节点这里说的Flink内存模型也就是TaskManager的内存模型JobManager的内存模型与TaskManager的内存模型类似。上图是Flink内存模型从图中可以看出Flink 进程总内存(Total Process Memory)包含了Flink总内存Total Flink Memory和JVM特定内存。Flink总内存又包括JVM堆内存JVM Heap、托管内存Managed Memory 、直接内存Direct Memory。下面分别介绍各个部分内存功能以及参数配置。Flink 总内存Total Flink MemoryTaskManager进程占用的所有与Flink相关的内存不包括JVM特定内存部分包含6个部分内存Framework堆内存、Task堆内存、托管内存、Framework非堆内存、Task非堆内存、Network关于Flink Framework和Flink Task使用的内存既有堆内内存也有堆外内存托管内存和Network使用的仅是堆外内存。Flink总内存配置参数根据不同的部署场景不同taskmanager.memory.flink.size 或者 taskmanager.memory.process.size容器部署指定参数无默认值需要用户指定。Flink堆内存JVM HeapFlink堆内存就是JVM堆内存JVM Heap分为Framework堆内存Framework Heap和Task堆内存Task Heap其中Framework 主要用于Flink框架本身需要的内存空间Task堆内存则用于Flink算子及用户代码的执行也被称为TaskExecutor使用的内存两者的主要区别在于是否将内存计入Slot计算资源中Framework堆内存不会将内存分配给SlotTask堆内存会分配给Slot。Framework堆内存Framework HeapFramework堆内存配置参数为taskmanager.memory.framework.heap.size该值默认为128M。Task 堆内存Task Heap非堆内存也可以叫做堆外内存更准确来说是大部分的堆外内存包含了托管内存Managed Memory、直接内存Direct Memory两部分。Flink非堆内存Off-Heap Memory直接内存Direct Memory直接内存Direct Memory分为Framework非堆内存Framework Off-Heap、Task 非堆内存Task Off-Heap和Network三个部分。直接内存主要作用是减少GC压力、提升性能效率。Framework非堆内存Framework Off-HeapFramework 非堆内存即taskexecutor的Framework 堆外内存大小不会分配给slot配置参数为taskmanager.memory.framework.off-heap.size默认值128M。Task非堆内存(Task Off-Heap)Task非堆内存配置参数taskmanager.memory.task.off-heap.size默认值为0即不使用。NetworkNetwork内存存储空间主要用于基于Netty进行网络数据交换数据传输的本地缓存例如TaskManager之间Shuffle、广播、与外部组件的数据传输。Network的配置相关参数有3个分别如下taskmanager.memory.network.min网络缓存的最小值默认64MBtaskmanager.memory.network.max网络缓存的最大值默认1GBtaskmanager.memory.network.fraction网络缓存占Flink总内存taskmanager.memory.flink.size的比例默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大就会限制到最小值或者最大值。JVM 特定内存JVM特定内存是JVM堆外内存的另一小部分内存其不在Flink总内存范围之内包括JVM元空间JVM Metaspace和JVM Overhead 两部分其中JVM元空间存储JVM加载类的元数据加载的类越多需要的内存空间越大JVM Overhead 则主要用于其他JVM开销例如代码缓存、线程栈等。Flink中将内存分成不同的区域实现了更加精准地内存控制在使用Flink过程中一般指定Flink总内存Total Flink Memorytaskmanager.memory.flink.size即可其他额外指定JVM内存参数不需额外指定如果需要根据Flink程序做一些调整建议有限调整fraction比例参数例如网络缓存占比taskmanager.memory.network.fraction根据网络流量大小调节与托管内存占比taskmanager.memory.managed.fraction根据RocksDB状态大小调节这样做可以间接影响任务内存的配额需要特别注意的是如果手动指定较多的固定参数很有可能出现内存配额冲突导致Flink程序部署失败。

相关新闻