【Flink精讲】Flink性能调优:CPU核数与并行度

2024-02-26 14:52

本文主要是介绍【Flink精讲】Flink性能调优:CPU核数与并行度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常见问题

举个例子

提交任务命令:

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

并行度为5,每个任务占用槽数为2,则需要申请3个容器(2*3=6),JobManager需要一个容器,共需要4个容器。6个vcore+JobManager的1个vcore共7个vcore。而实际上是4个容器,4个vcore,这是为什么呢?

实际运行效果: 

Yarn调度器设置

这跟yarn的调度器设置相关,找到capacity-scheduler.xml

  • default的方式只会参考内存来申请容器,不会考虑cpu的需求。
  • 调整为下面domian的方式,会综合考虑内存+CPU的需求来申请资源。

调整后运行效果:

刷新一下

 指定容器核心数

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Dyarn.containers.vcores=3 \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

一个容器3个核,2个slot,不是1:1的关系也可以。

slot主要隔离内存,不隔离cpu资源。

solt还有一个共享机制,一个slot可以同时跑多个task,一个solt可以不只使用一个线程。

通常让系统自动来设置,通常跟solt数1比1

并行度设置

  1. 配置文件:默认并行度,默认1
  2. 提交参数:如-p 5
  3. 代码env
  4. 代码算子

优先级下面的高。

全局并行度计算

        开发完成后,先进行压测。任务并行度给 10 以下,测试单个并行度的处理上限。然后
总QPS / 单并行度的处理能力 = 并行度
QPS使用高峰期的。
        开发完 Flink 作业,压测的方式很简单,先在 kafka 中积压数据,之后开启 Flink 任务,
出现反压,就是处理瓶颈。相当于水库先积水,一下子泄洪。
        不能只从 QPS 去得出并行度,因为有些字段少、逻辑简单的任务,单并行度一秒处理
几万条数据。 而有些数据字段多,处理逻辑复杂, 单并行度一秒只能处理 1000 条数据。
最好根据高峰期的 QPS 压测, 并行度*1.2 倍,富余一些资源。

查看单个任务的输出量:numRecordsOutPerSecond,单并行度7000条/秒,生成环境高峰期的qps:30000/s,30000/7000 = 4.x,并行度5,再乘以个冗余1.2 = 6个

如果数据源是kafka,可以按kafka分区数来设置并行度。 

大部分情况下并行度10以下即可。

Source 端并行度的配置

        数据源端是 Kafka, Source 的并行度设置为 Kafka 对应 Topic 的分区数。
        如果已经等于 Kafka 的分区数, 消费速度仍跟不上数据生产速度, 考虑下 Kafka 要扩
大分区, 同时调大并行度等于分区数。

        Flink 的一个并行度可以处理一至多个分区的数据,如果并行度多于 Kafka 的分区数,
那么就会造成有的并行度空闲,浪费资源。

Transform 端并行度的配置

Keyby 之前的算子

一般不会做太重的操作,都是比如 map、 filter、 flatmap 等处理较快的算子,并行度
可以和 source 保持一致。

Keyby 之后的算子

如果并发较大,建议设置并行度为 2 的整数次幂,例如: 128、 256、 512;
小并发任务的并行度不一定需要设置成 2 的整数次幂;
大并发任务如果没有 KeyBy,并行度也无需设置为 2 的整数次幂;

Sink 端并行度的配置

        Sink 端是数据流向下游的地方,可以根据 Sink 端的数据量及下游的服务抗压能力进行评估。 如果 Sink 端是 Kafka,可以设为 Kafka 对应 Topic 的分区数。
        Sink 端的数据量小, 比较常见的就是监控告警的场景,并行度可以设置的小一些。
        Source 端的数据量是最小的,拿到 Source 端流过来的数据后做了细粒度的拆分,数据量不断的增加,到 Sink 端的数据量就非常大。那么在 Sink 到下游的存储中间件的时候就需要提高并行度。
        另外 Sink 端要与下游的服务进行交互,并行度还得根据下游的服务抗压能力来设置,如果在 Flink Sink 这端的数据量过大的话, 且 Sink 处并行度也设置的很大,但下游的服务完全撑不住这么大的并发写入,可能会造成下游服务直接被写挂,所以最终还是要在 Sink处的并行度做一定的权衡。

这篇关于【Flink精讲】Flink性能调优:CPU核数与并行度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/749228

相关文章

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义