Flink内存配置分为JobManager内存配置和TaskManager内存配置。
配置项 | TaskManager配置参数 | JobManager配置参数 |
---|---|---|
Total Flink Memory | taskmanager.memory.flink.size | jobmanager.memory.flink.size |
Total Process Memory | taskmanager.memory.process.size | jobmanager.memory.process.size |
JobManager:Flink集群的控制单元,本地执行模式下不需要为 JobManager 进行内存配置,配置参数将不会生效。
TaskManager:负责执行用户代码
①Standlone模式:独立集群需要声明分配给Flink自身内存大小,配置·Total Flink Memory
较合适
②Flink On Yarn模式:容器化部署模式配置任务运行时TM占用总内存大小,超过这个值会被容器杀掉(即OOM),配置Total Process Memory
③细粒度配置方式:配置task heap (taskmanager.memory.task.heap.size) 和managed memory(taskmanager.memory.managed.size)
。
# 配置一
taskmanager.memory.flink.size:1024
# 配置二
taskmanager.memory.process.size:1024
# 配置三
taskmanager.memory.task.heap.size:1024
taskmanager.memory.managed.size:1024
(1)JVM元空间
taskmanager.memory.jvm-metaspace.size: 默认256mb
(2)JVM执行开销
taskmanager.memory.jvm-overhead.fraction: 默认0.1
taskmanager.memory.jvm-overhead.min: 默认192
mbtaskmanager.memory.jvm-overhead.max: 默认1gb
注意事项:总进程内存×fraction,如果小于配置的min(或大于配置的max)大小,则使用min/max大小
akka
等外部依赖,同时也负责运行checkpoint回调及作业提交时的用户代码。jobmanager.memory.off-heap.size: 默认128M
jobmanager.memory.heap.size
(1)JVM元空间
taskmanager.memory.jvm-metaspace.size: 默认256mb
(2)JVM执行开销
taskmanager.memory.jvm-overhead.fraction: 默认0.1
taskmanager.memory.jvm-overhead.min: 默认192
mbtaskmanager.memory.jvm-overhead.max:默认1gb
注意事项:总进程内存×fraction,如果小于配置的min(或大于配置的max)大小,则使用min/max大小
(1)堆内内存
taskmanager.memory.framework.heap.size:默认128MB
(2)堆外内存
taskmanager.memory.framework.off-heap.size:默认128MB
(1)堆外内存
堆外:taskmanager.memory.network.fraction:默认0.1
#内存区间
taskmanager.memory.network.min:默认64mb
taskmanager.memory.network.max:默认1gb
堆外:taskmanager.memory.managed.fraction,默认0.4
#默认内存
taskmanager.memory.managed.size,默认none
Flink内存×fraction
。(1)堆内内存
taskmanager.memory.task.heap.size:默认none,由Flink内存扣除掉其他部分的内存得到。
(2)堆外内存
taskmanager.memory.task.off-heap.size:默认0,表示不使用堆外内存
在Flink On Yarn模式下提交任务时,一般参数指定的是总进程内存:jobmanager.memory.process.size = 4G,taskmanager.memory.process.size = 8G,则每一块得到的内存大小如下:
JobManager总内存: 4096M
TaskManager总内存: 8192M
(1)JVM内存占用:256 + 409.6 = 665.6
JVM元数据:256M
JVM执行开销:4 × 1024 × 0.1 = 409.6M
,在【192,1024】之间,则消耗409.6M
(2)Flink框架堆外内存:128M
(3)Job内存:4096 - 665.6 - 128 = 3302.4M
(1)JVM内存占用:256 + 819.2 = 1075.2M
256M
8 × 1024 × 0.1 = 819.2M
,在【192,1024】之间,则消耗819.2MFlink内存: 7116.8M
(2)Flink框架内存:128 + 128 = 256M
128M
128M
Flink剩余内存: 6860.8M
(3)网络缓冲内存: 7116.8 × 0.1 = 711.68M
7116.8M × 0.1 = 711.68M
,在【192,1024】之间,则消耗711.68MFlink剩余内存: 6,149.12M
(4)托管内存:7116.8 × 0.4 = 2,846.72M
7116.8 × 0.4 = 2,846.72M
剩余内存:3,302.4M
(5)Task堆内内存:
3302.4M
Task堆内内存 = Task总内存 - (JVM内存 + Flink框架内存 + 网络缓冲内存 + 托管内存)
配置项 | TaskManager配置参数 | JobManager配置参数 |
---|---|---|
Total Flink Memory | taskmanager.memory.flink.size | jobmanager.memory.flink.size |
Total Process Memory | taskmanager.memory.process.size | jobmanager.memory.process.size |
./bin/standalone-job.sh start --job-classname \
-p 5 \ 指定并行度
-Dyarn.application.queue=test \ 指定yarn队列
-Djobmanager.memory.flink.size=2048mb \ JM2~4G足够
-Dtaskmanager.memory.flink.size=4096mb \ 单个TM2~8G足够
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
默认情况RocksDB 设置为将本机内存分配限制为托管内存的大小
TaskExecutorProcessUtils 或 JobManagerProcessUtils抛出的 IllegalConfigurationException
OutOfMemoryError: Java heap space
OutOfMemoryError: Metaspace
IOException: Insufficient number of network buffers
org.apache.flink.configuration.IllegalConfigurationException: JobManager memory configuration failed: Sum of configured JVM Metaspace (256.000mb (268435456 bytes)) and JVM Overhead (192.000mb (201326592 bytes)) exceed configured Total Process Memory (256.000mb (268435456 bytes)).
问题原因:Flink 容器尝试分配超出其请求大小(Yarn 或 Kubernetes)的内存
解决方案:增加 TaskManager 的总内存。