欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

大数据架构之Flink调优-资源配置调优

时间:2023-05-13

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或大数据齐全套课程资料请私信我或留言。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。