Flink是基于java的JVM运行,拥有高效的数据处理能力,但是考虑到用户在 Flink 上运行的应用的多样性,尽管flink框架已经为所有配置项提供合理的默认值,仍无法满足所有情况下的需求。 为了给用户生产提供最大化的价值, Flink 允许用户在整体上以及细粒度上对集群的内存分配进行调整。(本文介绍的内存配置方法适用于 1.11 及以上版本)

一、flink任务的总内存

 

        Flink JVM 进程的 进程总内存(Total Process Memory)包含了: Flink 任务和框架本身使用的内存(Total Flink Memory)和运行 Flink 的 JVM 本身使用的内存。 

        Flink 总内存(Total Flink Memory)包括 JVM 堆内存(Heap Memory)和堆外内存(Off-Heap Memory)。 其中堆外内存包括直接内存(Direct Memory)和本地内存(Native Memory)。

配置 Flink 进程内存最简单的方法是指定以下两个配置项中的任意一个:

  配置项 TaskManager 配置参数   JobManager 配置参数  
Total Flink Memorytaskmanager.memory.flink.sizejobmanager.memory.flink.size
Total Process Memorytaskmanager.memory.process.sizejobmanager.memory.process.size

二、TaskManager任务内存配置

        TaskManager负责执行用户代码。 根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用,增强作业运行的稳定性。

        与 JobManager 相比,TaskManager 具有相似但更加复杂的内存模型。

TaskManager内存详细模型:

 如上图所示,下表中列出了 Flink TaskManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。

组成部分配置参数描述
框架堆内存(Framework Heap Memory)taskmanager.memory.framework.heap.size用于 Flink 框架的 JVM 堆内存(进阶配置)
任务堆内存(Task Heap Memory)taskmanager.memory.task.heap.size用于 Flink 应用的算子及用户代码的 JVM 堆内存
托管内存(Managed memory)taskmanager.memory.managed.size
taskmanager.memory.managed.fraction
由 Flink 管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地内存
框架堆外内存(Framework Off-heap Memory)taskmanager.memory.framework.off-heap.size用于 Flink 框架的堆外内存(直接内存或本地内存)(进阶配置)
任务堆外内存(Task Off-heap Memory)taskmanager.memory.task.off-heap.size用于 Flink 应用的算子及用户代码的堆外内存(直接内存或本地内存)
网络内存(Network Memory)taskmanager.memory.network.min
taskmanager.memory.network.max
taskmanager.memory.network.fraction
用于任务之间数据传输的直接内存(例如网络传输缓冲)。该内存部分为基于 Flink 总内存的受限的等比内存部分。这块内存被用于分配网络缓冲
JVM Metaspacetaskmanager.memory.jvm-metaspace.size    Flink JVM 进程的 Metaspace
JVM开销taskmanager.memory.jvm-overhead.min
taskmanager.memory.jvm-overhead.max
taskmanager.memory.jvm-overhead.fraction
用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分

        以上有些内存部分的大小可以直接通过一个配置参数进行设置,有些则需要根据多个参数进行调整。

        通常情况下,不建议对框架堆内存和框架堆外内存进行调整。 除非非常肯定 Flink 的内部数据结构及操作需要更多的内存。 这可能与具体的部署环境及作业结构有关,例如非常高的并发度。 此外,Flink 的部分依赖(例如 Hadoop)在某些特定的情况下也可能会需要更多的直接内存或本地内存。

本地配置:

        如果你是将 Flink 作为一个单独的 Java 程序运行在你的电脑本地而非创建一个集群(例如在 IDE 中),那么只有下列配置会生效,其他配置参数则不会起到任何效果:

 组成部分 配置参数  本地执行时的默认值 
任务堆内存taskmanager.memory.task.heap.size无穷大
任务堆外内存taskmanager.memory.task.off-heap.size无穷大
托管内存taskmanager.memory.managed.size128Mb
网络内存

taskmanager.memory.network.min

taskmanager.memory.network.max

64Mb

三、JobManager内存配置

        JobManager 是 Flink 集群的控制单元。 它由三种不同的组件组成:ResourceManager、Dispatcher 和每个正在运行作业的 JobMaster。

        配置 JobManager 内存最简单的方法就是进程的配置总内存。本地执行模式下不需要为 JobManager 进行内存配置,配置参数将不会生效。

JobManager内存详细模型:

         如上图所示,下表中列出了 Flink JobManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。

组成部分配置参数描述
JVM 堆内存jobmanager.memory.heap.sizeJobManager 的 JVM 堆内存
堆外内存jobmanager.memory.off-heap.size    JobManager 的堆外内存(直接内存或本地内存)
JVM Metaspacejobmanager.memory.jvm-metaspace.sizeFlink JVM 进程的 Metaspace
JVM 开销    

jobmanager.memory.jvm-overhead.min

jobmanager.memory.jvm-overhead.max
jobmanager.memory.jvm-overhead.fraction

用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐