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
相关的配置参数是:
- -yjm 设置 JobManager 的大小。
- -ytm 设置 TaskManager 的大小。
- jobmanager.memory.process.size 和 taskmanager.memory.process.size 对应这 -yjm 和 -ytm 的大小。
- jobmanager.memory.jvm-overhead.fraction ,这个是设置 JVM overhead 的比例。
- taskmanager.memory.network.fraction ,network 部分的内存大小占比
- 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 各部分内存的大小,只需要知道下面的参数的大小即可。
- -yjm
- -yjm
- jobmanager.memory.jvm-overhead.fraction ,这个是设置 JVM overhead 的比例。
- taskmanager.memory.network.fraction ,network 部分的内存大小占比
- taskmanager.memory.managed.fraction, managed 占的比例大小。