Flink性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。
提交方式主要是yarn-per-job,资源的分配在使用脚本提交Flink任务时进行指定。
标准的Flink任务提交脚本(Generic CLI 模式)
从1.11开始,增加了通用客户端模式,参数使用-D
bin/flink run -t yarn-per-job -d -p 5 指定并行度-Dyarn.application.queue=test 指定yarn队列-Djobmanager.memory.process.size=1024mb 指定JM的总进程大小-Dtaskmanager.memory.process.size=1024mb 指定每个TM的总进程大小-Dtaskmanager.numberOfTaskSlots=2 指定每个TM的slot数-c com.atguigu.flink.tuning.UvDemo /opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar
参数列表:https://ci.apache.org/projects/flink/flink-docs-release-1.13/deployment/config.html
1、内存设置 1.1 TaskManager内存模型Flink1.10对TaskManager内存模型做了较大改动,Flink使用了堆上内存和堆外内存:
**framework Heap&framework Off-Heap:**Flink框架内存使用了堆上内存和堆外内存,不计入slot资源
**Task Heap&Task Off-Heap:**Task执行的内存使用了堆上内存和堆外内存
**NetWork(网络缓冲内存):**网络数据交换所使用的堆外内存,入网络数据交换缓冲区
**Direct Memory(直接内存) :**框架堆外内存、Task堆外内存、网络缓冲内存,都在堆外的直接内存里
**Managed Memory(托管内存):**Flink管理的堆外内存。用于管理排序、哈希表、缓存中间结果及RocksDB State Backend的本地内存
**JVM metaspace&JVM Overhead(JVM特有内存):**JVM本身占用的内存,包括元空间和执行开销
Total Flink Memory=framework Heap+framework Off-Heap+ask Heap+Task Off-Heap+NetWork+Managed Memory
Total Process Memory=Total Flink Memory+JVM metaspace+JVM Overhead
1.2 内存模型详解
**JVM 特定内存:**JVM本身占用的内存,包括元空间和执行开销
**JVM metaspace:**JVM元空间
taskmanager.memory.jvm-metaspace.size,默认256mb
**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大小
**框架内存:**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大小
**托管内存:**用于RocksDB State Backend 的本地内存和批的排序、哈希表、缓存中间结果。
堆外:taskmanager.memory.managed.fraction,默认0.4
taskmanager.memory.managed.size,默认none
如果size没指定,则等于Flink内存*fraction
2、案例分析基于Yarn模式,一般参数指定的是总进程内存,taskmanager.memory.process.size,比如指定为4G,每一块内存得到大小如下:
计算Flink内存
JVM元空间256m
JVM执行开销: 4g*0.1=409.6m,在[192m,1g]之间,最终结果409.6m
Flink内存=4g-256m-409.6m=3430.4m
网络内存=3430.4m0.1=343.04m,在[64m,1g]之间,最终结果343.04m
托管内存=3430.4m0.4=1372.16m
框架内存,堆内和堆外都是128m
Task堆内内存=3430.4m-128m-128m-343.04m-1372.16m=1459.2m
JVM Options:-Xmx1664299798 #约1875M=Task堆内存+框架内存-Xms1664299798 -XX:MaxDirectMemorySize=493921243 #约471M=Task堆外内存+框架堆外内存+网络内存-XX:MaxmetaspaceSize=268435456 #256M=JVM元空间
所以进程内存给多大,每一部分内存需不需要调整可以看内存的使用率来调整
3、生产资源配置示例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来描述数据情况。
本文是优极限大数据全套大数据教程之Flink调优的一部分文档,如需Flink或大数据齐全套课程资料请私信我或留言。