Flink 内存管理

一、内存分布图

JobManager 比较简单, 主要介绍一下 TaskManager。
在这里插入图片描述

在这里插入图片描述
部分配置文件 flink-conf.yaml

jobmanager.rpc.address: bigdata1

# The RPC port where the JobManager is reachable.

jobmanager.rpc.port: 6123


# The total process memory size for the JobManager.
#
# Note this accounts for all memory usage within the JobManager process, including JVM metaspace and other overhead.

jobmanager.memory.process.size: 2048m


# The total process memory size for the TaskManager.
#
# Note this accounts for all memory usage within the TaskManager process, including JVM metaspace and other overhead.

taskmanager.memory.process.size: 14g # ⭐️⭐️⭐️
# taskmanager.memory.task.heap.size: 10g
taskmanager.memory.managed.size: 1g
# To exclude JVM metaspace and overhead, please, use total Flink memory size instead of 'taskmanager.memory.process.size'.
# It is not recommended to set both 'taskmanager.memory.process.size' and Flink memory.
#
# taskmanager.memory.flink.size: 1280m

# The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline.

taskmanager.numberOfTaskSlots: 3

# The parallelism used for programs that did not specify and other parallelism.

parallelism.default: 1

二、参数调整

① taskmanager.memory.framework.heap.size=128MB
② (Total Flink Memory)(Framework Heap)(Managed Memory)(Task off-heap memory)(Network Memory) 
		= (14GB) - (256MB) - (128GB) - (1GB) - (1GB) = 10.5GB
③ taskmanager.memory.managed.size =128MB
		默认: taskmanager.memory.managed.fraction=0.4
		Total Flink Memory × fraction = (14GB-256MB-1GB) × 0.4 =  5.10GB
④ taskmanager.memory.framework.off-heap.size =128MB
⑤ 
⑥ Total Flink Memory × fraction = (14Gb-256MB) × 0.1 = 1.38 GB > max 1GB  --> 1GB
		taskmanager.memory.network.min:默认为64MB
		taskmanager.memory.network.max:默认为1gb
		taskmanager.memory.network.fraction:默认为0.1
⑦ taskmanager.memory.jvm-metaspace.size = 256MB
⑧ Total Flink Memory × fraction = (14Gb-256MB) × 0.1 = 1.38 GB > max 1GB  --> 1GB
		taskmanager.memory.jvm-overhead.min:默认为192MB,
		taskmanager.memory.jvm-overhead.max:默认为1GB
		taskmanager.memory.jvm-overhead.fraction:默认为0.1

三、具体用途

① Framework Heap

Framework Heap 其实是为 Task Executor 本身所配置的堆内存大小,Task Executor 本身也是一个 Java 进程。
Framework Heap 是 Flink 框架保留的,是不会用来执行 Task 的。该堆的大小由 taskmanager.memory.framework.heap.size 参数控制,它的运行所需资源比较轻量级,默认为128M。

② Task Heap

Task Heap Memory 是专门用于执行 Flink 任务的堆内存空间。该堆的大小由taskmanager.memory.task.heap.size参数指定。这个参数的默认为:
(Total Flink Memory) – (Framework Heap)– (Managed Memory) – (Task off-heap memory) – (Network Memory)

③ Managed Memory

Managed Memory 是由 Flink 直接管理的 off-heap 内存,它主要用于排序、哈希表、中间结果缓存、RocksDB的backend。其实它是Task Executor管理的off-heap内存。它可以由taskmanager.memory.managed.size 参数直接配置指定,默认是不配置的。默认是通过
taskmanager.memory.managed.fraction配置的因子(默认0.4)来设置Managed off-heap memory,默认为 Total Flink Memory 的 40% 。

如果不设置 taskmanager.memory.managed.size , 则 Managed Memory 计算如下:

taskmanager.memory.managed.size =128MB
默认: taskmanager.memory.managed.fraction=0.4
Total Flink Memory × fraction = (14GB-256MB-1GB) × 0.4 =  5.10GB

在这里插入图片描述

④ Framework Off-Heap

Task Executor 保留的 off-heap memory ,不会分配给任何slot。可以通过taskmanager.memory.framework.off-heap.size参数指定,默认为128M。Framework 所保留的内存,一般是不建议调整的。

⑤ Task Off-Heap

Task Executor执行的Task所使用的堆外内存。如果在Flink应用的代码中调用了Native的方法,需要用到off-heap内存,这些内存会分配到Off-heap堆外内存中。可以通过指定taskmanager.memory.task.off-heap.size来配置,默认为0。如果代码中需要调用Native Method并分配堆外内存,可以指定该参数。一般不使用,所以大多数时候可以保持0。

⑥ Network Memory

Network Memory使用的是Directory memory,在Task与Task之间进行数据交换时(shuffle),需要将数据缓存下来,缓存能够使用的内存大小就是这个Network Memory。它由是三个参数决定:

taskmanager.memory.network.min:默认为64MB
taskmanager.memory.network.max:默认为1gb
taskmanager.memory.network.fraction:默认为0.1

Network Memory 有两种配置方式,

  • 一种是通过 taskmanager.memory.network.fraction 参数,也就是Total Flink Memory的百分比,默认为Total Flink Meory 的10%。
  • 还有一种是通过 taskmanager.memory.network.mintaskmanager.memory.network.max指定 shuffle 缓存在 min, max 之间的内存空间。如果使用fraction计算出来的Network Meory超出min-max的范围,那么以min-max为准。如果配置的min和max是一样的值,就使用固定的内存大小。

以上面图示的例子:当前的Total Flink Meory为:(14Gb-256MB) ,而 taskmanager.memory.network.fraction为0.1,min为64MB,max为1GB,所以好Network Meory 大于 max ,所以最 max ,为 1GB。
计算公式如下:
Total Flink Memory × fraction = (14Gb-256MB) × 0.1 = 1.38 GB > max 1GB --> 1GB

⑦ 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:默认为192MB,
taskmanager.memory.jvm-overhead.max:默认为1GB
taskmanager.memory.jvm-overhead.fraction:默认为0.1。

参考文献:

参考文献:
https://blog.csdn.net/ChinaPoison/article/details/112163548
https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/deployment/config.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值