Flink实时任务性能调优

news2024/12/25 15:55:26

前言

通常我们在开发完Flink任务提交运行后,需要对任务的参数进行一些调整,通常需要调整的情况是任务消费速度跟不上数据写入速度,从而导致实时任务出现反压、内存GC频繁(FullGC)频繁、内存溢出导致TaskManager被Kill。

今天讲一下Flink任务中常见的性能场景及解决思路。

反压

在Flink任务中多个Task之间需要进行数据交换,在流式计算中数据的生产方的生产速度和消费方的消费速度不匹配时,可能会导致计算节点OOM或丢失数据,在Flink中通过反压机制平衡数据生产方和消费方的处理速度,以求系统达到整体的平衡。

实时任务出现反压时,在Blink版本中做了大量的改进,从资源使用、作业调优、日志查询等维度新增了大量功能,使得用户可以更方便的对Flink作业进行运维,Vertex 增加了InQueue,OutQueue等多项指标,可以方便的追踪数据的反压、过滤及倾斜情况通常,我们可以通过在Flink Web UI中观察出现红色的Vertex节点及其上下游,重点需要关注的指标是Out Queue的占用率,当Out Queue占用率高表示该节点的下游节点消费能力不足,需要重点调解该下游节点的计算资源(已贡献社区)。

如果是老的Flink版本,可以先在 Flink web ui 中,定位到具体的算子之后,查看 BackPressure 模块,通过颜色和数值来判断任务的繁忙和反压情况(若颜色为红色,表示当前算子繁忙,有反压的情况;若颜色为绿色,标识当前算子不繁忙,没有反压)。

如果你看到 subtasks 的状态为 OK 表示没有反压。HIGH 表示这个 subtask 被反压。状态用如下定义:

  • OK: 0% <= 反压比例 <= 10%
  • LOW: 10% < 反压比例 <= 50%
  • HIGH: 50% < 反压比例 <= 100%

常见场景及解决思路

场景一、任务反压(算子消费瓶颈)

典型场景为,一连串的计算节点都是红色,Out Queue都是100%,此时需要定位到最后一个Out Queue为100%的算子节点的下游节点,该节点的消费能力不达标,导致上游消息堆积。我们可以对该算子的资源进行调整,如 适当调大并发度,对应内存可适当调小,如果是窗口聚合节点则可以调大内存(在开窗场景下,window数据计算节点需要缓存窗口大小时长的数据,并在checkpoint时需要将窗口的中间状态存储,因此需要增加窗口计算节点的堆内存)

场景二、任务无反压,但延迟高(source端瓶颈)

这种情况表现为,整体没有出现明显反压,即所有计算节点的Out Queue都不高。

这种情况的出现,有可能是上游源头节点的并发度不够,如kafka的topic有三个分区,消费的时候,只开了一个并发,通常建议消费并发数和topic的分区一致。

如果增加source的并发度之后,延迟没有下降,则可能是在任务源头节点包含复杂计算,且该算子和源头并发一致,出现了合并任务链(operater chain),此时可以考虑将source算子单独剥离出来,即调整source下游算子的并发度,解除合并任务链。

场景三、任务异常(内存超用)

实时任务异常Failover的情况下,我们需要关注任务是否因为某个TaskManager内存超用被kill的情况,如果发现异常日志中记录了:

"org.apache.flink.runtime.io.network.netty.exception.RemoteTransportException: Connection unexpectedly closed by remote task manager 'null'. This might indicate that the remote task manager was lost"

则普遍情况是因为内存超用,我们需要根据异常信息中提示的任务节点,调整执行计划中对应节点的内存配置,具体可在WebUI中查看Exceptions模块中查看,其中Root Exception里面记录了最新一次发生的异常栈,Exception History中记录的是任务运行过程中所有发生的异常,以及每次异常的计算节点是哪些。

场景四、GroupBy

针对group by场景,可以通过配置minibatch,来提升吞吐,降低状态的访问,减少对下游的输出压力。

在Stram SQL纯流模式下,每进来一条数据都会去操作state,IO消耗较大,设置minibatch后,同一个key的一批数据只访问一次state,且只输出最新的一条数据,即减少了state的访问也减少了向下游的数据更新,minibatch的配置如下:

# 1. 表示整个job允许延迟
blink.miniBatch.allowLatencyMs=5000

# 2. 单个batch的size
blink.miniBatch.size=1000

场景五、任务重启,并设置重启时间(初始时间)

这种情况一般出现在任务刚启动时有非常高的延迟,可能是因为在任务启动时或重启时设置了一个比较老的start time,导致任务从很早的时间开始拉取数据,会导致刚开始整个任务的qps非常高,在监控上的表现为一开始有很高的延迟,随后缓慢下降直到正常水平,若没有下降则可以适当增加资源,一般来说这种情况不需要特殊处理,可以根据实际需求来判断是否需要调整start time为当前时间。

场景六、Time Interval Join 代替 双流Join

建议在双流join的时候,使用时间窗口join,而不是双流join。

默认情况下双流join会将两条流的数据都缓存到状态中,默认状态存储时长为1.5天,状态太大会导致join算子性能低下。

而实际上大部分场景,join都是由时效性要求的,比如商品曝光1分钟引导的点击,其业务上隐含了数据的时效性关联条件,当数据失效后,它的状态是可以清理掉释放资源。

 

总结

  1. 判断是否出现反压,在反压节点定位算子,增加并发或调整cpu资源;
  2. 若无明显反压,则可能是source端瓶颈,可以提升并发度,尽量和source源的分区数量一致,另外可以查看是否是因为source数据处理的算子逻辑太复杂,且和读算子并行一致出现合并任务链(operater chain)的情况,此时可以调整该计算算子的并行度,将source算子剥离出链。
  3. 参数优化,配置minibatch(针对GroupBy),可提升吞吐,降低状态的访问次数,减少对下游的输出压力。
  4. 双流join场景中使用Time Interval Join,而不是双流Join,双流Join会把状态保持1.5天,非常消耗资源。
  5. 重置任务时,根据实际需求出发,若默认很久以前的数据可放弃,则可以调整start time为较近的时间。
  6. 提升batchSize增加读写IO。

希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔记】数字电路基础1 - 门电路

目录 数字电路基础与门电路数电基础基本门电路复合门电路TTL 门电路CMOS 门电路 数字电路基础与门电路 数电基础 数字电路中常将 0 &#xff5e; 1V 范围的电压称为低电平&#xff0c;用“0”表示&#xff1b;而将 3 &#xff5e; 5V 范围的电压称为高电平&#xff0c;用“1”…

【InnoDB 存储引擎】InnoDB 存储引擎的行格式,有 Compact、Redundant、Dynamic 等行格式还有它们配套实验(理论篇)

文章目录 1 InnoDB 行记录格式&#xff08;理论&#xff09;1.1 Redundant 行记录格式1.2 Compact 行记录格式&#xff08;重点&#xff09;1.3 行溢出数据1.4 Compressed 和 Dynamic 行记录格式1.5 CHAR 的行结构存储 2 参考资料 1 InnoDB 行记录格式&#xff08;理论&#xf…

什么是数据一致性

什么是数据一致性 数据一致性这个单词在平常开发中&#xff0c;或者各种文章中都能经常看见&#xff0c;我们常常听见什么东西数据不一致了&#xff0c;造成了一定的损失&#xff0c;赶快修复一下。但是很多同学对一致性具体代表什么意思&#xff0c;他有什么作用依然不是很了解…

车载软件架构 —— 闲聊几句AUTOSAR OS(八)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Overleaf 集成git出现authentification failed 的解决方法

Overleaf 集成git遇到的问题和解决办法 需求背景&#xff1a;使用git 将overleaf 项目克隆到本地硬盘上工作&#xff0c;像写代码一样管理论文版本。 问题描述&#xff1a;直接使用overleaf提供的git clone xxxx 会出现authentication failed for xxxxx (见下图&#xff09; …

C++中的继承/虚继承原理

C中的继承 文章目录 C中的继承1.继承的概念和定义1.1 继承定义1.12 继承关系和访问限定符2.基类和派生类对象的复制转换3.继承中的作用域4.派生类的默认成员函数继承与友元 6.**继承与静态成员****复杂的菱形继承及菱形虚拟继承**7.虚继承解决数据冗余和二义性的原理 1.继承的概…

git 技术点整理

1.git安装 1.1官网下载 Git 安装详情见https://www.cnblogs.com/liuwenwu9527/p/11688323.html 1.2配置 2.git基本概念 2.1本地 工作区(Working Directory)&#xff1a;就是你在电脑里能看到的目录。说人话就是idea直接能看到的这部分纯代码区域。&#xff08;不含 .git…

基于51单片机的太阳追光系统设计

本实例是基于51单片机的太阳追光系统&#xff0c;主要硬件由51单片机最小系统&#xff0c;四路光敏感应电路&#xff0c;ADC0832转换电路、LED指示灯电路、X轴与Y轴步进电机构成。 设计功能 1.四路光敏感应电路&#xff1a;四路光敏电阻分别感应上、下、左、右四个方向的光强…

两组表单看懂MySQL的多表查询

第一组表单信息 1、查询每个部门的所属员工 mysql> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 d-> LEFT JOIN emp3 e-> ON d.deptno e.dept_id-> GROUP BY d.deptno-> UNION -> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 …

代码随想录算法训练营第六十天| 84.柱状图中最大的矩形

柱状图中最大的矩形 题目链接&#xff1a; 力扣 假设以柱子1&#xff08;指值为1的柱子&#xff09;为基准&#xff0c;柱子1的左侧没有比柱子1矮的元素&#xff0c;所以柱子1可以无限像左边扩展&#xff0c;柱子1的右侧也没有比柱子1矮的元素&#xff0c;所以柱子1可以无限向…

用OpenCV进行图像分割--进阶篇

1. 引言 大家好&#xff0c;我的图像处理爱好者们&#xff01; 在上一篇幅中&#xff0c;我们简单介绍了图像分割领域中的基础知识&#xff0c;包含基于固定阈值的分割和基于OSTU的分割算法。这一次&#xff0c;我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲…

如何提升问卷数据的有效性?

问卷调查法是收集数据的宝贵工具&#xff0c;可以为商业、社会科学和医疗保健等众多领域的决策过程提供真实可靠的数据信息。然而&#xff0c;问卷数据的准确性和可靠性是影响最终结论的关键因素&#xff0c;而他们取决于问卷设计和数据收集过程的质量。在本文中&#xff0c;我…

Coggle 30 Days of ML(23年7月)任务三:使用TFIDF提取文本特征

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务三&#xff1a;使用TFIDF提取文本特征 任务三&#xff1a;使用TFIDF提取文本特征 说明&#xff1a;在这个任务中&#xff0c;需要使用Sklearn库中的TFIDF技术来提取文本特征&#xff0c;将文本转化为可供机器学习算法…

数分面试题:赛马问题

问题一&#xff1a; 25匹马&#xff0c;一个赛道&#xff0c;每次可以跑5匹马&#xff0c;在没有计时器的情况下&#xff0c;怎么用最小的比赛次数知道最快的前三名 关键点&#xff1a;通过前面的比赛&#xff0c;排除掉没有悬念的马&#xff08;能确定有3匹马比它快的&#…

Iptables与Firewalld

Iptables防火墙 介绍 iptables和netfilter是一套Linux防火墙工具&#xff0c;共同合作完成系统防护工作。iptables 是一个包过滤防火墙&#xff0c;可以对包进行封装、过滤、重定向或者网络地址转换、地址伪装、透明代理、访问控制、连接跟踪等功能&#xff0c;iptables是一个…

4.6 x64dbg 内存扫描与查壳实现

LyScript 插件中默认提供了多种内存特征扫描函数&#xff0c;每一种扫描函数用法各不相同&#xff0c;在使用扫描函数时应首先搞清楚不同函数之间的差异&#xff0c;本章内容将分别详细介绍每一种内存扫描函数是如何灵活运用&#xff0c;并实现一种内存查壳脚本&#xff0c;可快…

Linux常用命令——exec命令

在线Linux命令查询工具 exec 调用并执行指定的命令 补充说明 exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中&#xff0c;可以调用其他的命令。如果在当前终端中使用命令&#xff0c;则当指定的命令执行完毕后会立即退出终端。 语法 exec(选项)(参数…

计算机组成原理32位MIPS CPU设计实验(指令译码器电路设计 、时序发生器状态机设计、时序发生器输出函数、硬布线控制器)

实验四 32位MIPS CPU设计实验 这次实验是32位MIPS CPU设计实验&#xff08;单总线CPU-定长指令周期-3级时序)&#xff0c;在头歌当中一共需要我们进行六道题的测试&#xff0c;分别为MIPS指令译码器设计&#xff0c;定长指令周期&#xff08;时序发生FSM设计&#xff0c;时序发…

数据结构05:树与二叉树[C++][哈夫曼树HuffmanTree]

图源&#xff1a;文心一言 考研笔记整理6k字&#xff0c;小白友好、代码可跑&#xff0c;请小伙伴放心食用~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图、画配图~&#x1f9e9;&#x1f9e9; 参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》…

一纸文书之MySQL的回忆录

MySQL要点学习&#xff1a;你可以在简历上说熟悉MySQL 什么是数据库&#xff1f;什么是数据库管理系统&#xff1f;什么是MySQL&#xff1f;什么是SQL&#xff1f;数据库数据库管理系统&#xff1a;SQL&#xff1a;结构化查询语言三者之间的关系 安装MySQL数据库管理系统MySQL常…