TaskManager内存模型

Flink任务管理器(TaskManager)
参数列表:
https://ci.apache.org/projects/flink/flink-docs-release-1.13/deployment/config.html

image.png

1、内存模型详解
JVM 特定内存:JVM 本身使用的内存,包含 JVM 的 metaspace 和 over-head
1)JVM metaspace:JVM 元空间
taskmanager.memory.jvm-metaspace.size,默认 256mb
2)JVM over-head 执行开销:JVM 执行时自身所需要的内容,包括线程堆栈、IO、编译 缓存等所使用的内存。
taskmanager.memory.jvm-overhead.fraction,默认 0.1
taskmanager.memory.jvm-overhead.min,默认 192mb
taskmanager.memory.jvm-overhead.max,默认 1gb
总进程内存*fraction,如果小于配置的 min(或大于配置的 max)大小,则使用 min/max 大小 区间就是 [192mb,1gb]

框架内存:Flink 框架,即 TaskManager 本身所占用的内存,不计入 Slot 的资源中。
堆内:taskmanager.memory.framework.heap.size,默认 128MB
堆外:taskmanager.memory.framework.off-heap.size,默认 128MB

Task 内存:Task 执行用户代码时所使用的内存
堆内:taskmanager.memory.task.heap.size,默认 none,由 Flink 内存扣除掉其他部分的内存得到。
堆外:taskmanager.memory.task.off-heap.size,默认 0,表示不使用堆外内存

网络内存:网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区
堆外:taskmanager.memory.network.fraction,默认 0.1
taskmanager.memory.network.min,默认 64mb
taskmanager.memory.network.max,默认 1gb
Flink 内存*fraction,如果小于配置的 min(或大于配置的 max)大小,则使用 min/max大小 [64mg,1gb]

托管内存:用于 RocksDB State Backend 的本地内存和批的排序、哈希表、缓存中间结果。
堆外:taskmanager.memory.managed.fraction,默认 0.4
taskmanager.memory.managed.size,默认 none
如果 size 没指定,则等于 Flink 内存 * fraction

案例分析

基于Yarn模式,一般参数指定的是总进程内存,taskmanager.memory.process.size,
比如指定为 4G,每一块内存得到大小如下:

1)计算 Flink 内存

JVM 元空间 256m
JVM 执行开销: 4g*0.1=409.6m,在[192m,1g]之间,最终结果 409.6m
Flink 内存=4g-256m-409.6m=3430.4m

2)计算网络内存

网络内存=3430.4m*0.1=343.04m,在[64m,1g]之间,最终结果 343.04m

3)计算托管内存

托管内存=3430.4m*0.4=1372.16m

4)计算框架内存

框架内存,堆内和堆外都是 128m

5)计算Task堆内内存

Task 堆内内存= 3430.4m-128m-128m-343.04m-1372.16m=1459.2m
堆内内存等于 = Flink内存 - 计算框架堆内/堆外 内存 - 计算网络内存 - 计算托管内存 = 剩余的Task 堆内内存

样例图:

image.png

生产资源配置示例

bin/flink run \ -t yarn-per-job \ -d \ -p 5 \ 指定并行度 -Dyarn.application.queue=test \ 指定 yarn 队列 -Djobmanager.memory.process.size=2048mb \ JM2~4G 足够 -Dtaskmanager.memory.process.size=4096mb \ 单个 TM2~8G 足够 -Dtaskmanager.numberOfTaskSlots=2 \ 与容器核数 1core:1slot 或 2core:1slot -c com.atguigu.flink.tuning.UvDemo \ /opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

Flink 是实时流处理,关键在于资源情况能不能抗住高峰时期每秒的数据量,通常用 QPS/TPS 来描述数据情况。

QPS(Query Per Second):每秒请求数
TPS : 系统吞吐量