flink1.10内存模型及参数详解

flink1.10内存模型见上图,具体含义如下:

TaskManager进程总内存(Total Process Memory)

含义

在容器化部署(on YARN/K8s/Mesos)环境下使用,是Flink总内存、JVM元空间与JVM额外内存开销的和,也就是容器本身的内存大小。

参数

taskmanager.memory.process.size:无默认值,需要用户指定。

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,即不使用。

JVM元空间(Metaspace)

含义

JDK8中的MetaSpace。

参数

taskmanager.memory.jvm-metaspace.size:默认值96MB。

JVM额外开销(Overhead)

含义

为JVM预留的其他本地内存,用于线程栈、代码缓存等,作用有些类似于之前版本中为容器预留的截断(cutoff)内存。当然在1.10版本中,原先的containerized.heap-cutoff-ratio与containerized.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参数设置如下:

taskmanager.memory.process.size = 2048 MB

taskmanager.memory.network.fraction = 0.1

taskmanager.memory.managed.fraction = 0.4

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

taskmanager.memory.process.size=2048MB

taskmanager.memory.jvm-metaspace.size=96MB(默认值)

taskmanager.memory.jvm-overhead=2048 * 0.1=204MB

taskmanager.memory.flink.size=2048-96-204=1748MB

taskmanager.memory.network= 1748*0.1=175MB

taskmanager.memory.managed.size 1748*0.4=699MB

taskmanager.memory.framework.off-heap.size=128MB(默认值)

taskmanager.memory.framework.heap.size=128MB(默认值)

taskmanager.memory.task.off-heap.size=0

taskmanager.memory.task.heap.size=1748-175-699-128-128-0=618MB

实际情况我们可以通过后台验证

如上图,我们先通过jps命令找到TaskManager的进程号,然后通过ps命令查找到TaskManager进程的启动命令,其命令如下:

/opt/soft/java/jdk18/bin/java -XX:+UseG1GC -Xmx781818251 -Xms781818251 -XX:MaxDirectMemorySize=317424929 -XX:MaxMetaspaceSize=100663296 -Dlog.file=/data/flink-1.10.0/log/flink-root-taskexecutor-0-vm.log -Dlog4j.configuration=file:/data/flink-1.10.0/conf/log4j.properties -Dlogback.configurationFile=file:/data/flink-1.10.0/conf/logback.xml -classpath /data/flink-1.10.0/lib/flink-table_2.11-1.10.0.jar:/data/flink-1.10.0/lib/flink-table-blink_2.11-1.10.0.jar:/data/flink-1.10.0/lib/log4j-1.2.17.jar:/data/flink-1.10.0/lib/slf4j-log4j12-1.7.15.jar:/data/flink-1.10.0/lib/flink-dist_2.11-1.10.0.jar::/opt/soft/hadoop/hadoop-2.7.2/etc/hadoop: org.apache.flink.runtime.taskexecutor.TaskManagerRunner --configDir /data/flink-1.10.0/conf -D taskmanager.memory.framework.off-heap.size=134217728b -D taskmanager.memory.network.max=183207201b -D taskmanager.memory.network.min=183207201b -D taskmanager.memory.framework.heap.size=134217728b -D taskmanager.memory.managed.size=732828804b -D taskmanager.cpu.cores=1.0 -D taskmanager.memory.task.heap.size=647600523b -D taskmanager.memory.task.off-heap.size=0b

将参数拆解出来验证下:

-Xmx781818251 -Xms781818251 //746MB (framework heap + task heap) (128+618=746 对的上)

-XX:MaxDirectMemorySize=317424929 //303MB (framework off-heap + task off-heap + network) (128+0+175=303 对的上)

-XX:MaxMetaspaceSize=100663296 //96MB (jvm metaspace) (默认值)

-D taskmanager.memory.framework.off-heap.size=134217728b //128MB (默认值)

-D taskmanager.memory.network.max=183207201b //175MB (对的上)

-D taskmanager.memory.network.min=183207201b //175MB (对的上)

-D taskmanager.memory.framework.heap.size=134217728b //128MB (默认值)

-D taskmanager.memory.managed.size=732828804b //699MB (对的上)

-D taskmanager.cpu.cores=1.0

-D taskmanager.memory.task.heap.size=647600523b //618MB (对的上)

-D taskmanager.memory.task.off-heap.size=0b (默认值)

通过对比可以发现实际启动参数和我们计算的参数的值是可以对的上的。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊一cherry大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值