Flink TaskManager 内存模型详解

Apache Flink 通过严格控制其各个组件的内存使用,在 JVM 之上提供了高效的工作负载。虽然社区努力为所有配置提供合理的默认值,但不可能适用于用户在 Flink 上部署的所有应用程序。为了向我们的用户提供最大的生产价值,Flink 允许在集群内进行高级和细粒度的内存分配调优。

我们都知道不管 Flink 运行在什么集群上,真正干活的都是 TaskManager (后面简称为 TM),JobManager (后面简称为 JM)只负责任务的调度,所以了解 TM 的内存模型是非常有必要的,今天这篇文章就来说一下 TM 的内存模型,JM 的内存模型相对简单,这里就不再说了.

在 Flink 1.10.0 版本中,社区对 TM 的内存模型做了进一步的改进和升级,虽然内存的划分已经很明确,但还是让人看的眼花缭乱,容易混淆.先来看下面这张图.

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 中的配置是能对上的.

总结

上面这么多的内存,到底应该怎么配置呢?首先官网不建议同时设置进程总内存和 Flink 总内存。 这可能会造成内存配置冲突,从而导致部署失败。 额外配置其他内存部分时,同样需要注意可能产生的配置冲突。

其实 taskmanager.memory.framework.heap.size ,taskmanager.memory.framework.off-heap.size,JVM Metaspace,JVM Overhead 这几个参数一般情况下是不需要配置的,走默认值就可以了.我们主要关注的是 Task Heap、Managed Memory、Network 这几部分的内存,当然 Flink 本身也会计算出这 3 部分的内存,我们自己也需要根据任务的特点,比如流量大小,状态大小等去调整.

推荐阅读

Flink SQL 如何实现列转行?

Flink SQL 结合 HiveCatalog 使用

Flink SQL 解析嵌套的 JSON 数据

Flink SQL 中动态修改 DDL 的属性

Flink WindowAssigner 源码解析

Flink 1.11.x WatermarkStrategy 不兼容问题

[图片上传失败...(image-6a4c29-1617465251937)]

如果你觉得文章对你有帮助,麻烦点一下在看吧,你的支持是我创作的最大动力.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容