Flink 1.10之改进的TaskManager内存模型与配置

前言

Flink社区在FLIP-49提出了新版统一的TaskManager内存模型及配置,这也是Flink 1.10版本最主要的改进与优化点之一。根据社区的说法,该proposal致力于解决1.9版本及之前的TM内存配置的三个缺点:

  1. 流处理与批处理作业的内存配置方法不同;
  2. 流处理作业中RocksDB状态后端的内存配置过于复杂,需要小心控制堆外内存的消耗量;
  3. 内存配置有隐藏细节,且比较晦涩难懂,例如容器化会有内存截断(cutoff)等,详情可参见笔者之前写过的《探究Flink on YARN模式下TaskManager的内存分配》

由于内存模型发生了变化,所以Flink 1.10作业的内存配置参数也与1.9版本之前有比较大的区别,本文就来具体看一看,防止生产环境中踩坑。

新版内存模型与参数概览

官方给出的图示如下。

下面看图说话,分区域介绍之。

Flink总内存(Total Flink Memory)
  • 含义
    TaskManager进程占用的所有与Flink相关的内存(不包括JVM元空间和其他额外开销)。具体包含4大块:Flink框架内存(堆内、堆外)、托管内存(仅堆外)、网络缓存(仅堆外)、任务内存(堆内、堆外)。
  • 参数
    taskmanager.memory.flink.size:无默认值,需要用户指定。
Flink框架(Framework)内存
  • 含义
    Flink Runtime底层占用的内存,一般来讲相对固定,不需要更改。极特殊情况下才需要调大一些,比如非常高的算子并行度,或者与外部系统(如Hadoop)有密集交互等等。
  • 参数
    • taskmanager.memory.framework.heap.size:堆内部分(Framework Heap),默认值128MB;
    • taskmanager.memory.framework.off-heap.size:堆外部分(Framework Off-Heap),以直接内存形式分配,默认值128MB。
托管(Managed)内存
  • 含义
    纯堆外内存,由MemoryManager管理,用于中间结果缓存、排序、哈希表等,以及RocksDB状态后端。可见,RocksDB消耗的内存可以由用户显式控制了,不再像旧版本一样难以预测和调节。
  • 参数
    • taskmanager.memory.managed.fraction:托管内存占Flink总内存taskmanager.memory.flink.size的比例,默认值0.4;
    • taskmanager.memory.managed.size:托管内存的大小,无默认值,一般也不指定,而是依照上述比例来推定,更加灵活。
网络(Network)缓存
  • 含义
    纯堆外内存,用于TaskManager之间(shuffle、广播等)及与外部组件的数据传输,以直接内存形式分配。
  • 参数
    • taskmanager.memory.network.min:网络缓存的最小值,默认64MB;
    • taskmanager.memory.network.max:网络缓存的最大值,默认1GB;
    • taskmanager.memory.network.fraction:网络缓存占Flink总内存taskmanager.memory.flink.size的比例,默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。
任务(Task)内存
  • 含义
    顾名思义,是算子逻辑和用户代码、自定义数据结构真正占用的内存。
  • 参数
    • taskmanager.memory.task.heap.size:堆内部分(Task Heap),无默认值,一般不建议设置,会自动用Flink总内存减去框架、托管、网络三部分的内存推算得出。
    • taskmanager.memory.task.off-heap.size:堆外部分(Task Off-Heap),以直接内存形式分配,默认值为0,即不使用。
TaskManager进程总内存(Total Process Memory)
  • 含义
    在容器化部署(on YARN/K8s/Mesos)环境下使用,是Flink总内存、JVM元空间与JVM额外内存开销的和,也就是容器本身的内存大小。
  • 参数
    taskmanager.memory.process.size:无默认值,需要用户指定。
JVM元空间(Metaspace)
  • 含义
    不用多费口舌了吧(
  • 参数
    taskmanager.memory.jvm-metaspace.size:默认值256MB。
JVM额外开销(Overhead)
  • 含义
    为JVM预留的其他本地内存,用于线程栈、代码缓存等,作用有些类似于之前版本中为容器预留的截断(cutoff)内存。当然在1.10版本中,原先的containerized.heap-cutoff-ratiocontainerized.heap-cutoff-min参数对TM就不再生效了。

  • 参数

    • 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。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

Flink内存参数与JVM参数的关系

上述内存参数会直接影响启动TaskManager时使用的JVM参数,使用相关工具可以观察到。

  • -Xmx/-Xms:对应堆内框架内存与任务内存之和;
  • -XX:MaxDirectMemorySize:对应三块直接内存,即堆外框架内存、任务内存与网络缓存之和;
  • -XX:MaxMetaspaceSize:对应JVM元空间设置。

到底该如何配置?

一大堆参数看得人眼花缭乱,但实际用起来并不需要管那么多。简而言之:

  • 如果是Standalone部署,就指定Flink总内存taskmanager.memory.flink.size
  • 如果是容器化部署,就指定TM进程总内存taskmanager.memory.process.size

其他部分内存的分配大可交给Flink本身去决定。如果需要依照业务特点做微调的话,建议首先修改网络缓存占比taskmanager.memory.network.fraction(根据网络流量大小)与托管内存占比taskmanager.memory.managed.fraction(根据RocksDB状态大小等),进而能够间接影响任务内存的配额。手动指定较多的参数——特别是固定内存量的参数——容易使内存配额出现冲突,导致部署失败,要小心。

举个栗子呗

假设Flink on YARN环境,设置如下:

taskmanager.memory.process.size = 4096 MB
taskmanager.memory.network.fraction = 0.15
taskmanager.memory.managed.fraction = 0.45

可以推算得出各内存指标为:

taskmanager.memory.jvm-overhead = 4096 * 0.1 = 409.6 MB
taskmanager.memory.flink.size = 4096 - 409.6 - 256 = 3430.4 MB
taskmanager.memory.network = 3430.4 * 0.15 = 514.56 MB
taskmanager.memory.managed = 3430.4 * 0.45 = 1543.68 MB
taskmanager.memory.task.heap.size = 3430.4 - 128 * 2 - 1543.68 - 514.56 = 1116.16 MB

The End

民那晚安晚安。

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

推荐阅读更多精彩内容