大家好,欢迎来到IT知识分享网。
Flink性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。
提交方式主要是yarn-per-job,资源的分配在使用脚本提交Flink任务时进行指定。
标准的Flink任务提交脚本(Generic CLI 模式)
从1.11开始,增加了通用客户端模式,参数使用-D <property=value>指定:
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
IT知识分享网
参数列表: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
IT知识分享网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或大数据齐全套课程资料请私信我或留言。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6304.html