Flink TaskManager 内存模型

2021-12-15 14:30:24 浏览数 (1)

Flink TM 内存模型

image-20210403163557657.png

在 Flink 1.12.0 版本中对 UI 进行了改进,在 TM 的页面增加了一个内存模型图,清楚的显示了每个区域的内存配置以及使用情况.

Total Process Memory (进程总内存) 包含了 Flink 应用程序使用的全部内存资源:Total Flink Memory (Flink应用使用的内存) 运行 Flink JVM 使用的内存。Total Process Memory 对应 Yarn/Mesos 等容器化部署模式(需要用户指定),相当于申请容器的大小,Total Flink Memory 对应 standalone 部署模式(需要用户指定)。

Total Flink Memory 内部分成了:堆内内存 堆外内存:

堆内内存包括两部分:FreameWork Heap Memory (框架堆内存) Task Heap Memory (任务堆内存)

堆外内存包含三部分:Managed Memory (托管内存) Framework Off-heap Memory (框架堆外内存) Network Memory (网络内存)

下面就按照上图中编号顺序分别介绍一下这些内存的作用以及如何配置

Framework Heap

含义描述

Flink 框架本身占用的内存,这部分的内存一般情况下是不需要修改的,在特殊的情况下可能需要调整.

参数设置
  • taskmanager.memory.framework.heap.size:堆内部分(Framework Heap),默认值 128M;
  • taskmanager.memory.framework.off-heap.size:堆外部分(Framework Off-Heap),以直接内存形式分配,默认值 128M。

Task Heap

含义描述

用于 Flink 应用的算子及用户代码占用的内存。

参数设置
  • taskmanager.memory.task.heap.size:堆内部分(Task Heap),无默认值,一般不建议设置,会自动用 Flink 总内存减去框架、托管、网络三部分的内存推算得出。
  • taskmanager.memory.task.off-heap.size:堆外部分(Task Off-Heap),以直接内存形式分配,默认值为 0,即不使用。如果代码中需要调用 Native Method 并分配堆外内存,可以指定该参数。一般不使用,所以大多数时候可以保持0。

Managed Memory

含义描述

纯堆外内存,由 MemoryManager 管理,用于中间结果缓存、排序、哈希表等,以及 RocksDB 状态后端。可见,RocksDB

消耗的内存可以由用户显式控制了,不再像旧版本一样难以预测和调节。

参数设置
  • taskmanager.memory.managed.fraction:托管内存占 Flink 总内存 taskmanager.memory.flink.size 的比例,默认值 0.4;
  • taskmanager.memory.managed.size:托管内存的大小,无默认值,一般也不指定,而是依照上述比例来推定,更加灵活。

Network

含义描述

Network Memory 使用的是 Directory memory,在 Task 与 Task

之间进行数据交换时(shuffle),需要将数据缓存下来,缓存能够使用的内存大小就是这个 Network Memory。它由是三个参数决定:

参数设置
  • taskmanager.memory.network.min:网络缓存的最小值,默认 64MB;
  • taskmanager.memory.network.max:网络缓存的最大值,默认 1GB;
  • taskmanager.memory.network.fraction:网络缓存占 Flink 总内存 taskmanager.memory.flink.size 的比例,默认值 0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

JVM Metaspace

含义描述

从 JDK 8 开始,JVM 把永久代拿掉了。类的一些元数据放在叫做 Metaspace 的 Native Memory 中。在 Flink 中的 JVM

Metaspace Memory 也一样,它配置的是 Task Manager JVM 的元空间内存大小。

参数设置
  • taskmanager.memory.jvm-metaspace.size:默认值 256MB。

JVM Overhead

含义描述

保留给 JVM 其他的内存开销。例如:Thread Stack、code cache、GC 回收空间等等。和 Network Memory

的配置方法类似。它也由三个配置决定

参数设置
  • taskmanager.memory.jvm-overhead.min:JVM 额外开销的最小值,默认 192MB;
  • taskmanager.memory.jvm-overhead.max:JVM 额外开销的最大值,默认 1GB;
  • taskmanager.memory.jvm-overhead.fraction:JVM 额外开销占 TM 进程总内存
  • taskmanager.memory.process.size(注意不是 Flink 总内存)的比例,默认值 0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

我们再来看一下 TM 启动日志里面内存相关的配置信息如下:

<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-

bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px

10px;">`INFO org.apache.flink.yarn.YarnTaskExecutorRunner [] - Program

Arguments: INFO org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] -

taskmanager.memory.framework.off-heap.size=134217728b(128M) INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] -

taskmanager.memory.network.max=214748368b(204.8M) INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] -

taskmanager.memory.network.min=214748368b(204.8M) INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] -

taskmanager.memory.framework.heap.size=134217728b(128M) INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] -

taskmanager.memory.managed.size=858993472b(819.2M) INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - taskmanager.cpu.cores=4.0

INFO org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] -

taskmanager.memory.task.heap.size=805306352b(767.9M) INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - -D INFO

org.apache.flink.yarn.YarnTaskExecutorRunner [] - taskmanager.memory.task.off-

heap.size=0b` </pre>

这个内存就是上图中 Configured Values 显示的值,我们把这些值加起来 taskmanager.memory.framework.off-

heap.size taskmanager.memory.network.max

taskmanager.memory.framework.heap.size taskmanager.memory.managed.size

taskmanager.memory.task.heap.size = 128 205 128 819 768 =

taskmanager.memory.flink.size = 2048M 这个结果跟我们在 flink-conf.yaml 中的配置是能对上的.

0 人点赞