Flink 内存模型各部分大小计算公式

如果 Flink 是运行在 yarn 或者 standalone 模式的话,其实都是运行在 JVM 的基础上的,所以首先 Flink 组件运行所需要给 JVM 本身要耗费的内存大小。无论是 JobManager 或者 TaskManager ,他们 JVM 内存的大小都是一样的,都是由 JVM metaspace 和 JVM overhead 组成的。metaspace 元空间的部分,保存 JVM 中 class 类等区域,然后 JVM overhead 是本地内存、垃圾回收等。

在 yarn 环境下,启动的启动程序为 YarnTaskExecutorRunner 入口类型。一个例子为

bash 复制代码
bigdata  30032 29862  2  2024 ?        3-07:08:13 /usr/bin/java 
-Xmx1664299798 
-Xms1664299798 
-XX:MaxDirectMemorySize=493921243 
-XX:MaxMetaspaceSize=268435456 
-Dlog.file=/path/to/container_e09_xx/taskmanager.log 
-Dlog4j.configuration=file:./log4j.properties 
-Dlog4j.configurationFile=file:./log4j.properties org.apache.flink.yarn.YarnTaskExecutorRunner 
-D taskmanager.memory.network.min=359703515b 
-D taskmanager.cpu.cores=2.0 
-D taskmanager.memory.task.off-heap.size=0b 
-D taskmanager.memory.jvm-metaspace.size=268435456b 
-D external-resources=none 
-D taskmanager.memory.jvm-overhead.min=429496736b 
-D taskmanager.memory.framework.off-heap.size=134217728b 
-D taskmanager.memory.network.max=359703515b 
-D taskmanager.memory.framework.heap.size=134217728b 
-D taskmanager.memory.managed.size=1438814063b 
-D taskmanager.memory.task.heap.size=1530082070b 
-D taskmanager.numberOfTaskSlots=2 
-D taskmanager.memory.jvm-overhead.max=429496736b 
--configDir . 
-Dblob.server.port=10751 
-Djobmanager.rpc.address=hadoop0010 
-Djobmanager.memory.jvm-overhead.min=429496736b 
-Dtaskmanager.resource-id=container_e09_1727170467339_0012_01_000004 
-Dweb.port=0 
-Djobmanager.memory.off-heap.size=134217728b 
-Dweb.tmpdir=/tmp/flink-web-ae106a66-21e0-410e-8c8a-2ea943474c5a 
-Dinternal.taskmanager.resource-id.metadata=hadoop0005:30445 
-Djobmanager.rpc.port=18745 
-Drest.bind-address=hadoop0010 
-Drest.address=hadoop0010 
-Djobmanager.memory.jvm-metaspace.size=268435456b 
-Djobmanager.memory.heap.size=3462817376b 
-Djobmanager.memory.jvm-overhead.max=429496736b

JobManager 的入口类是 YarnJobClusterEntrypoint ,一个例子是:

bash 复制代码
bigdata  12455 12391  0  2024 ?        06:56:25 /usr/bin/java 
-Xmx3462817376 -Xms3462817376 
-XX:MaxMetaspaceSize=268435456 
-Dlog.file=/path/to/application_xxx/container_xxx/jobmanager.log 
-Dlog4j.configuration=file:log4j.properties 
-Dlog4j.configurationFile=file:log4j.properties org.apache.flink.yarn.entrypoint.YarnJobClusterEntrypoint 
-D jobmanager.memory.off-heap.size=134217728b 
-D jobmanager.memory.jvm-overhead.min=429496736b 
-D jobmanager.memory.jvm-metaspace.size=268435456b 
-D jobmanager.memory.heap.size=3462817376b 
-D jobmanager.memory.jvm-overhead.max=429496736b

相关的配置参数是:

  1. -yjm 设置 JobManager 的大小。
  2. -ytm 设置 TaskManager 的大小。
  3. jobmanager.memory.process.size 和 taskmanager.memory.process.size 对应这 -yjm 和 -ytm 的大小。
  4. jobmanager.memory.jvm-overhead.fraction ,这个是设置 JVM overhead 的比例。
  5. taskmanager.memory.network.fraction ,network 部分的内存大小占比
  6. taskmanager.memory.managed.fraction, managed 占的比例大小。

    上图是官方 TaskManager 的内存模型。下面按照配置来计算一下各部分的内存大小,看看是否和 YarnTaskExecutorRunner 启动命令中对应的内存大小相同。需要指出的是的使用资源平台是 yarn , -ytm 为 4 gb

先计算,JVM overhead = Math.max( taskmanager.memory.process.size0.1 , 192M), math.max( 41024 *0.1 , 192M) = 409.6 约等于 410 M

MVM metaspace 固定值 256

Network = (Taskmanager.memory.process.size - JVM metaspace - JVM overhead)0.1,(41024 - 256- 410 )*0.1= 343M

Framework off-heap 128M 固定支出。

Managed Memory =( taskmanager.memory.process.size - JVM metaspace - JVM overhead)0.4 , 还需要四舍五入, (41024 - 256- 410)*0.4 / 1024 = 13.4G

TaskHeap = taskmanager.memory.process.size - JVM metaspace - JVM Overhead - Network - Framewokr off-heap - Managed memory - Framework heap = (41024 - 256 - 410 - 343 - 128 - 1.341024 - 128)/1024 = 1.42 G

YarnTaskExecutorRunner 的启动命令中,-Xmx1664299798 -Xms1664299798 两个参数设置的是 heap memory 的大小, 1664299798/1024/1024/1024 = 1.55 G ,task heap + framework heap = 1.42G + 128M = 1.42 + 0.125 = 1.55G

-XX:MaxDirectMemorySize=493921243 代表了 framework off-heap + task off-heap + network off-heap = 128M + 343M = 0.46G , 493921243/1024/1024/1024 = 0.46 G 。

-XX:MaxMetaspaceSize=268435456 268435456/1024/1024 = 256 M

-D taskmanager.memory.network.min=359703515b 这个是 network 的最小值。

-D taskmanager.cpu.cores=2.0 设置 taskmanager core 的数量

-D taskmanager.memory.task.off-heap.size=0b ,这个和结果是一致的 task off-head 就是 0 。

-D taskmanager.memory.jvm-metaspace.size=268435456b , 这个与 -XX:MaxMetaspaceSize 的大小是一致的。

-D taskmanager.memory.jvm-overhead.min=429496736b ,这个 overhead 的最小值。

-D taskmanager.memory.framework.off-heap.size=134217728b , 这个是 fremework off-heap 的 128 M , 这个是固定大小。

-D taskmanager.memory.network.max=359703515b 这个是 network off-heap 的最大值

-D taskmanager.memory.framework.heap.size=134217728b 固定大小,128 M

-D taskmanager.memory.managed.size=1438814063b ,managed memory 的大小,计算得来的大小是 13.4G ,正好是 1438814063/1024/1024/1024 的大小。

-D taskmanager.memory.task.heap.size=1530082070b

-D taskmanager.numberOfTaskSlots=2 ,这个是每个 taskmanager slot 的个数。

-D taskmanager.memory.jvm-overhead.max=429496736b 这个是 overhead 的大小, 它是 410 M ,正好是429496736/1024/1024/1024 的大小。

所以对于 yarn 平台来说,要想了解 TM 和 JM 各部分内存的大小,只需要知道下面的参数的大小即可。

  1. -yjm
  2. -yjm
  3. jobmanager.memory.jvm-overhead.fraction ,这个是设置 JVM overhead 的比例。
  4. taskmanager.memory.network.fraction ,network 部分的内存大小占比
  5. taskmanager.memory.managed.fraction, managed 占的比例大小。
相关推荐
吴永琦(桂林电子科技大学)1 小时前
Git 与 Git常用命令
大数据·git·elasticsearch
开着拖拉机回家1 小时前
【Hadoop】大数据权限管理工具Ranger2.1.0编译
大数据·hadoop·权限管理·ranger·源码编译
B站计算机毕业设计超人2 小时前
计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
大数据·hadoop·深度学习·机器学习·spark·知识图谱·课程设计
The god of big data5 小时前
教程 | HDFS基本使用方法详解
大数据·hadoop·hdfs
抛砖者6 小时前
5 Flink的时间和窗口操作
服务器·flink·window操作·flink时间语义
li10116121206 小时前
flink的streamGraph逻辑图优化为jobGraph
大数据·flink
ayt0076 小时前
【Flink源码分析】6. Flink1.19源码分析-Flink底层的异步通信
大数据·flink
专注API从业者7 小时前
反向海淘独立站未来发展趋势:机遇与挑战并存,如何抢占先机?
大数据·开发语言·前端·数据仓库
ayt0077 小时前
【Flink源码分析】5. Flink1.19源码分析-异步编程(CompletableFuture)
大数据·flink