0%

Flink TaskManager 内存模型

本文适用于 1.10 及以上版本,整理自 Flink 官网-配置 TaskManager 内存

非本地执行

内存模型(Memory Model)

Simple Memory Model

simple_mem_model

Detailed Memory Model

detailed-mem-model

配置选项(Configuration Options)

Overview

Overview

进程总内存(Total Process Memory)

taskmanager.memory.process.size = (none)

对于容器化部署模式(Containerized Deployment),这相当于申请的容器(Container)大小。

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。


欢迎关注我的其它发布渠道