探究 Flink on YARN 模式下 TaskManager 的内存分配

本文深入解析了Flink on YARN环境下的内存管理机制,详细阐述了TaskManager内存分配逻辑,包括网络缓存、托管内存的计算方式,以及JobManager内存参数设置。通过源码分析,揭示了各内存块的实际大小及其影响因素。

一、任务提交

我们使用如下的参数提交了Flink on YARN作业

flink run -m yarn-cluster -p 5 -yjm 3072 -ytm 4096 -ynm flink-test -d -c com.test.Test flink-test-1.0.0-SNAPSHOT.jar

二、查看内存情况

该作业启动了1个TaskManager,占用5个slot,并正常运行。来到该任务的Web界面,打开TaskManager页面,看看它的内存情况。

虽然我们在参数中设置了 TaskManager 的内存为4GB,但图上显示的JVM堆大小只有2.66GB,另外还有一项“Flink Managed Memory”为1.79GB。这些值都是怎么计算出来的呢?

三、TM内存分布

为了减少 object overhead,Flink主要采用序列化的方式存储各种对象。序列化存储的最小单位叫做 MemorySegment,底层为字节数组,大小由 taskmanager.memory.segment-size 参数指定,默认32KB大。下面分别介绍各块内存:

  • 网络缓存(Network Buffer):用于网络传输及与网络相关的动作(shuffle、广播等)的内存块,由MemorySegment组成。从Flink 1.5版本之后,网络缓存固定分配在堆外,这样可以充分利用零拷贝等技术。与它相关的三个参数及我们的设定值如下:
# 网络缓存占TM内存的默认比例,默认0.1
taskmanager.network.memory.fraction: 0.1
# 网络缓存的最小值和最大值 ,默认64MB和1GB
taskmanager.network.memory.min: 64mb
taskmanager.network.memory.max: 1gb

   

详见:flink 官网

  • 托管内存(Flink Managed Memory):用于所有Flink内部算子逻辑的内存分配,以及中间数据的存储,同样由MemorySegment组成,并通过Flink的MemoryManager组件管理。它默认在堆内分配,如果开启堆外内存分配的开关,也可以在堆内、堆外同时分配。与它相关的两个参数如下:
# 堆内托管内存占TM堆内内存的比例,默认0.7
taskmanager.memory.fraction: 0.7
# 是否允许分配堆外托管内存,默认不允许
taskmanager.memory.off-heap: false

详见:官网

Flink的内存管理不像Spark一样区分Storage和Execution内存,而是直接合二为一,更加灵活。

  • 空闲内存(Free):虽然名为空闲,但实际上是存储用户代码和数据结构的,固定在堆内,可以理解为堆内内存除去托管内存后剩下的那部分。

    如果我们想知道文章开头的问题中各块内存的大小是怎么来的,最好的办法自然是去读源码。下面以Flink 1.8.1源码为例来探索。

四、JobManager内存参数设置

JM启动时, 去掉yarn container占用内存大小, 即为JM大小。 container大小为25%*heap, 但是不得小于600MB。

jm heap = max[600, 3072*0.25] = 768

所以剩余JM heap大小为(3072-768)MB=2304MB。 

五、TaskManager内存分配逻辑

 org.apache.flink.client.deployment.ClusterSpecification:

/**
 * Description of the cluster to start by the {@link ClusterDescriptor}.
 */
public final class ClusterSpecification {
	private final int masterMemoryMB;
	private final int taskManagerMemoryMB;
	private final int numberTaskManagers;
	private final int slotsPerTaskManager;

	private ClusterSpecification(int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

magic_kid_2010

你的支持将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值