大数据相关

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

2020-04-21  本文已影响0人  LittleMagic

前言

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)
Flink框架(Framework)内存
托管(Managed)内存
网络(Network)缓存
任务(Task)内存
TaskManager进程总内存(Total Process Memory)
JVM元空间(Metaspace)
JVM额外开销(Overhead)

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

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

到底该如何配置?

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

其他部分内存的分配大可交给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

民那晚安晚安。

上一篇下一篇

猜你喜欢

热点阅读