赞
踩
flink1.10内存模型见上图,具体含义如下:
TaskManager进程总内存(Total Process Memory)
含义
在容器化部署(on YARN/K8s/Mesos)环境下使用,是Flink总内存、JVM元空间与JVM额外内存开销的和,也就是容器本身的内存大小。
参数
taskmanager.memory.process.size:无默认值,需要用户指定。
Flink总内存(Total Flink Memory)
含义 TaskManager进程占用的所有与Flink相关的内存(不包括JVM元空间和其他额外开销)。具体包含4大块:Flink框架内存(堆内、堆外)、托管内存(仅堆外)、网络缓存(仅堆外)、任务内存(堆内、堆外)。
参数taskmanager.memory.flink.size:无默认值,需要用户指定。
Flink框架(Framework)内存
含义
Flink Runtime底层占用的内存,一般来讲相对固定,不需要更改。极特殊情况下才需要调大一些,比如非常高的算子并行度,或者与外部系统(如Hadoop)有密集交互等等。
参数
taskmanager.memory.framework.heap.size:堆内部分(Framework Heap),默认值128MB;
taskmanager.memory.framework.off-heap.size:堆外部分(Framework Off-Heap),以直接内存形式分配,默认值128MB。
托管(Managed)内存
含义
纯堆外内存,由MemoryManager管理,用于中间结果缓存、排序、哈希表等,以及RocksDB状态后端。可见,RocksDB消耗的内存可以由用户显式控制了,不再像旧版本一样难以预测和调节。
参数
taskmanager.memory.managed.fraction:托管内存占Flink总内存taskmanager.memory.flink.size的比例,默认值0.4;
taskmanager.memory.managed.size:托管内存的大小,无默认值,一般也不指定,而是依照上述比例来推定,更加灵活。
网络(Network)缓存
含义
纯堆外内存,用于TaskManager之间(shuffle、广播等)及与外部组件的数据传输,以直接内存形式分配。
参数
taskmanager.memory.network.min:网络缓存的最小值,默认64MB;
taskmanager.memory.network.max:网络缓存的最大值,默认1GB;
taskmanager.memory.network.fraction:网络缓存占Flink总内存taskmanager.memory.flink.size的比例,默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。
任务(Task)内存
含义
顾名思义,是算子逻辑和用户代码、自定义数据结构真正占用的内存。
参数
taskmanager.memory.task.heap.size:堆内部分(Task Heap),无默认值,一般不建议设置,会自动用Flink总内存减去框架、托管、网络三部分的内存推算得出。
taskmanager.memory.task.off-heap.size:堆外部分(Task Off-Heap),以直接内存形式分配,默认值为0,即不使用。
JVM元空间(Metaspace)
含义
JDK8中的MetaSpace。
参数
taskmanager.memory.jvm-metaspace.size:默认值96MB。
JVM额外开销(Overhead)
含义
为JVM预留的其他本地内存,用于线程栈、代码缓存等,作用有些类似于之前版本中为容器预留的截断(cutoff)内存。当然在1.10版本中,原先的containerized.heap-cutoff-ratio与containerized.heap-cutoff-min参数对TM就不再生效了。
参数
taskmanager.memory.jvm-overhead.min:JVM额外开销的最小值,默认192MB;
taskmanager.memory.jvm-overhead.max:JVM额外开销的最大值,默认1GB;
taskmanager.memory.jvm-overhead.fraction:JVM额外开销占TM进程总内存taskmanager.memory.process.size(注意不是Flink总内存)的比例,默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。
Flink内存参数与JVM参数的关系
上述内存参数会直接影响启动TaskManager时使用的JVM参数,使用相关工具可以观察到。
-Xmx/-Xms:对应堆内框架内存与任务内存之和;
-XX:MaxDirectMemorySize: 对应三块直接内存,即堆外框架内存、任务内存与网络缓存之和;
-XX:MaxMetaspaceSize: 对应JVM元空间设置。
到底该如何配置?
一大堆参数看得人眼花缭乱,但实际用起来并不需要管那么多。简而言之:
如果是Standalone部署,就指定Flink总内存taskmanager.memory.flink.size;
如果是容器化部署,就指定TM进程总内存taskmanager.memory.process.size。
其他部分内存的分配大可交给Flink本身去决定。如果需要依照业务特点做微调的话,建议首先修改网络缓存占比taskmanager.memory.network.fraction(根据网络流量大小)与托管内存占比taskmanager.memory.managed.fraction(根据RocksDB状态大小等),进而能够间接影响任务内存的配额。手动指定较多的参数——特别是固定内存量的参数——容易使内存配额出现冲突,导致部署失败,要小心。
举个例子
假设flink参数设置如下:
taskmanager.memory.process.size = 2048 MB
taskmanager.memory.network.fraction = 0.1
taskmanager.memory.managed.fraction = 0.4
可以推算得出各内存指标为:
taskmanager.memory.process.size=2048MB
taskmanager.memory.jvm-metaspace.size=96MB(默认值)
taskmanager.memory.jvm-overhead=2048 * 0.1=204MB
taskmanager.memory.flink.size=2048-96-204=1748MB
taskmanager.memory.network= 1748*0.1=175MB
taskmanager.memory.managed.size 1748*0.4=699MB
taskmanager.memory.framework.off-heap.size=128MB(默认值)
taskmanager.memory.framework.heap.size=128MB(默认值)
taskmanager.memory.task.off-heap.size=0
taskmanager.memory.task.heap.size=1748-175-699-128-128-0=618MB
实际情况我们可以通过后台验证
如上图,我们先通过jps命令找到TaskManager的进程号,然后通过ps命令查找到TaskManager进程的启动命令,其命令如下:
/opt/soft/java/jdk18/bin/java -XX:+UseG1GC -Xmx781818251 -Xms781818251 -XX:MaxDirectMemorySize=317424929 -XX:MaxMetaspaceSize=100663296 -Dlog.file=/data/flink-1.10.0/log/flink-root-taskexecutor-0-vm.log -Dlog4j.configuration=file:/data/flink-1.10.0/conf/log4j.properties -Dlogback.configurationFile=file:/data/flink-1.10.0/conf/logback.xml -classpath /data/flink-1.10.0/lib/flink-table_2.11-1.10.0.jar:/data/flink-1.10.0/lib/flink-table-blink_2.11-1.10.0.jar:/data/flink-1.10.0/lib/log4j-1.2.17.jar:/data/flink-1.10.0/lib/slf4j-log4j12-1.7.15.jar:/data/flink-1.10.0/lib/flink-dist_2.11-1.10.0.jar::/opt/soft/hadoop/hadoop-2.7.2/etc/hadoop: org.apache.flink.runtime.taskexecutor.TaskManagerRunner --configDir /data/flink-1.10.0/conf -D taskmanager.memory.framework.off-heap.size=134217728b -D taskmanager.memory.network.max=183207201b -D taskmanager.memory.network.min=183207201b -D taskmanager.memory.framework.heap.size=134217728b -D taskmanager.memory.managed.size=732828804b -D taskmanager.cpu.cores=1.0 -D taskmanager.memory.task.heap.size=647600523b -D taskmanager.memory.task.off-heap.size=0b
将参数拆解出来验证下:
-Xmx781818251 -Xms781818251 //746MB (framework heap + task heap) (128+618=746 对的上)
-XX:MaxDirectMemorySize=317424929 //303MB (framework off-heap + task off-heap + network) (128+0+175=303 对的上)
-XX:MaxMetaspaceSize=100663296 //96MB (jvm metaspace) (默认值)
-D taskmanager.memory.framework.off-heap.size=134217728b //128MB (默认值)
-D taskmanager.memory.network.max=183207201b //175MB (对的上)
-D taskmanager.memory.network.min=183207201b //175MB (对的上)
-D taskmanager.memory.framework.heap.size=134217728b //128MB (默认值)
-D taskmanager.memory.managed.size=732828804b //699MB (对的上)
-D taskmanager.cpu.cores=1.0
-D taskmanager.memory.task.heap.size=647600523b //618MB (对的上)
-D taskmanager.memory.task.off-heap.size=0b (默认值)
通过对比可以发现实际启动参数和我们计算的参数的值是可以对的上的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。