Flink 性能优化总结(反压优化篇)

news2024/11/18 11:47:48

反压的理解

Flink 中每个节点间的数据都以阻塞队列的方式传输,下游来不及消费导致队列被占满后,上游的生产也会被阻塞,最终导致数据源的摄入被阻塞。简单来说就是系统接收数据的速率远高于它处理数据的速率。
反压如果不能得到正确的处理,可能会影响到 checkpoint 时长和 state 大小,甚至可能会导致资源耗尽甚至系统崩溃。 这两个影响对于生产环境的作业来说是十分危险的,因为 checkpoint 是保证数据一致性的关键,checkpoint 时间变长有可能导致 checkpoint 超时失败,而 state 大小同样可能拖慢 checkpoint 甚至导致 OOM。
因此,我们在生产中要尽量避免出现反压的情况。

反压产生原因和解决方案

(1)数据倾斜
相同 Task 的多个 Subtask 中,个别 Subtask 接收到的数据量明显大于其他 Subtask 接
收到的数据量,通过 Flink Web UI 可以精确地看到每个 Subtask 处理了多少数据,即可
判断出 Flink 任务是否存在数据倾斜。
如下图所示,0 号 SubTask 接受的数据远大于其他 SubTask。
在这里插入图片描述
出现这种情况的原因:
在这里插入图片描述如上图所示,当 key 的分布不均匀时,keyby 后会将数据分区,相同 key 的数据会发送到同
一个 subTask 中,从而造成数据倾斜。
解决方案:
(1)keyby 之后不统计
在这里插入图片描述
如上图所示,对分布不均匀的 key 拼上一个随机数,使 key 变得分散。
如果我们keyby之后没有统计需求,比如说keyby之后为sink算子,就可以使用此方法解决。
(2)keyby 之后统计(一次聚合)
在这里插入图片描述
如上图所示,对分布不均匀的 key 拼上一个随机数,使 key 变得分散。但是这样统计
出来的数据有几个弊端。
1、原本统计出来相同 key 只有一条数据,但是现在分散为几条数据,这样虽然减
轻了 reduce 的压力,但是增大了 sink 的压力。
2、如果 sink 端为 mysql 且为多并行度,这样会导致多个 sink 算子操作同一条数据,最
造成插入失败和统计数据丢失的问题。
(3)keyby 之后统计(二次聚合)
在这里插入图片描述
如上图所示,对第一次聚合出来的数据再进行一次聚合。
优化后:
在这里插入图片描述
(2)代码问题
如果不是数据倾斜,最常见的问题可能是用户代码的执行效率问题(频繁被阻塞或者性能问题),需要找到瓶颈算子中的哪部分计算逻辑消耗巨大。
最有用的办法就是对 TaskManager 进行 CPU profile,从中我们可以分析到 Task Thread 阻塞在哪里,可能是用户函数本身有些同步的调用,可能是 checkpoint 或者 GC 等系统活动导致的暂时系统暂停。
看顶层的哪个函数占据的宽度最大。只要有"平顶",就表示该函数可能存在性能问题。
火焰图如下图所示:
在这里插入图片描述
从上图中可以清晰的看出此算子一直在查询数据库,从火焰图进行分析非常方便就定位
到了问题所在。可在配置文件中通过 rest.flamegraph.enabled: true 开启。
容易导致反压的几个代码问题即解决方案:
**1、频繁查询数据库扩充数据或调用外部 API **
使用缓存:
小量数据可以使用进程缓存或者 Redis,尽量不要频繁查询数据库。使用缓存需注意缓存穿透问题
异步 io:
Flink 提供异步 Api,具体可查看官方文档。
布隆过滤器:
对于数据量很大,且允许一定误判率的情况下,可先使用布隆过滤器对数据进行过滤。
2、Sink 端 Mysql 大量修改统计数据
批量执行:
Sink 端的所有操作都使用批量操作,减小 IO 次数,并且事务一次性提交。
单并行度入库:
多线程操作 Mysql 会导致 CPU 频繁切换上下文,会造成 Mysql 性能降低。
Mysql 参数优化:
innodb_buffer_pool_size:Innodb 缓冲池大小,缓冲池会缓存数据和索引,此值可根据实际情况调整,减少读写 IO 次数。
innodb-flush-log-at-trx-commit:将此值设为 0,每过 1 秒会把 log_buffer 中的数据刷新至log_file 中,然后同步刷新到磁盘,这样性能最高,但是宕机会丢失前 1 秒的数据。
sync_binlog:将此值设为 0,当事务提交之后,并不会将 binlog_cache 中的数据刷新到磁盘,而是由文件系统决定什么时候将 cache 数据刷新到磁盘中,性能最高。
innodb_flush_method:将此值设置为 O_DIRECT,此参数的目的是让 Mysql 在写入时绕过操作系统缓存,直接写入磁盘,提高写入性能。
统计开窗时间可适当延长:对于统计数据来说,操作 Mysql 大量都是修改,可将开窗时间适当延长,减少 IO 次数。
Sink 异步化
因为统计算子的特殊性,可使用线程池将 sink 任务丢到线程池中异步执行,这样就不会出现操作 Mysql 时反压严重的情况。

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

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

相关文章

Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)

使用IDEA直接运行Hadoop项目,有两种方式,分别是本地式:本地安装HadoopIDEA;远程式:远程部署Hadoop,本地安装IDEA并连接, 本文介绍第二种。 一、安装配置Hadoop (1)虚拟机伪分布式 见上才艺&a…

【C++】反向迭代器仿函数模板进阶

反向迭代器&仿函数&模板进阶 一,反向迭代器1. 什么是反向迭代器2. 模拟实现3. 如何使用 二,仿函数1. 仿函数的概念2. 仿函数的用法 三,模板1. 非类型模板参数2. 模板的特化2.1 特化概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.…

借助 Terraform 功能协调部署 CI/CD 流水线-Part2

在第一部分的文章中,我们介绍了3个步骤,完成了教程的基础配置: 使用 Terraform 创建 AWS EKS Infra在 EKS 集群上部署 ArgoCD 及其依赖项设置 Bitbucket Pipeline并部署到 ECR Repo 本文将继续完成剩余的步骤,以实现 Terraform 编…

【2024金三银四】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

搭建mysql主从复制(主主复制)

1:设主库允许远程连接(注意:设置账号密码必须使用的插件是mysql_native_password,其他的会连接失败) #切换到mysql这个数据库,修改user表中的host,使其可以实现远程连接 mysql>use mysql; mysql>update user se…

Vue3全家桶 - VueRouter - 【3】嵌套路由【children】

嵌套路由【children】 如果在路由视图中展示的组件包含自己的路由占位符(路由出口),则此处会用到嵌套路由;如图所示:点击关于链接,则会展示About组件,在其组件中又包含了路由链接和路由占位符&…

3、设计模式之工厂模式

工厂模式是什么?     工厂模式是一种创建者模式,用于封装和管理对象的创建,屏蔽了大量的创建细节,根据抽象程度不同,主要分为简单工厂模式、工厂方法模式以及抽象工厂模式。 简单工厂模式 看一个具体的需求 看一个…

Python绘图-14绘制3D图(上)

14.1绘制3D散点图 14.1.1图像呈现 14.1.2绘图代码 import numpy as np # 导入numpy库,numpy是Python的一个强大的数值计算扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 import matplotlib.pyplot a…

GPT与R 在生态环境领域数据统计分析

原文链接:GPT与R 在生态环境领域数据统计分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597092&idx2&sn0a7ac5cf03d37c7b4659f870a7b71a77&chksmfa823dc3cdf5b4d5ee96a928a1b854a44aff222c82b2b7ebb7ca44b27a621edc4c824115babe&…

Python(单词识别、汉诺塔、学生信息管理系统、生词本)

一、单词识别 周一到周日的英文依次为:Monday、Tuesday、Wednesday、Thusday、Friday、Saturday和Sunday,这些单词的首字母基本都不相同,在这7个单词的范围之内,通过第一或前两个字母即可判断对应的是哪个单词。 本任务要求编写…

案例分析篇04:数据库设计相关28个考点(1~8)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Docker 容器化技术:构建高效、可移植的开发环境和部署流程|Docker 的分层设计

容器技术是云原生的核心技术之一,利用容器化技术,可以将微服务以及它所需要的配置、依赖关系、环境变了等都可以便捷地部署到新的服务器节点上,而不用再次重新配置,这就使得微服务具备了强大的可移植性。 二、Docker 的分层设计 …

研发效能DevOps: OpenEuler 部署 drone 持续集成平台

目录 一、实验 1.环境 2.OpenEuler 部署 drone 持续集成平台 二、问题 1.drone登录失败 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168.204.145(动态) 192.168.204.141&…

github 中的java前后端项目整合到本地运行

前言: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未…

安卓多个listView拖动数据交换位置和拖动

注意这里只是给出大概思路&#xff0c;具体可以参考修改自己想要的 public class MainActivity extends AppCompatActivity {private ListView listView1;private ListView listView2;private ArrayAdapter<String> adapter1;private ArrayAdapter<String> adapter…

搭建交换机模拟环境及SSH连接,华为NSP软件入门使用教程

搭建交换机模拟环境及SSH连接&#xff0c;华为NSP软件入门使用教程 如果你是通过搜索搜到了这篇文章&#xff0c;那么一定是工作或者学习中需要用交换机&#xff0c;但是又没物理机测试学习&#xff0c;所以需要搭建本地的虚拟环境学习。 这篇文章是我进行交换机命令入门学习写…

阅读欣赏推荐之(三)——纪录片《地平线系列:大数据时代》

现今的我们正处于一个时代转型中&#xff0c;因为科技的发展与互联网的日益强大&#xff0c;数据将逐步取代旧事物&#xff0c;创造出新事物。当今社会以一种前所未有的方式&#xff0c;通过对海量数据进行分析&#xff0c;获得巨大价值的产品和服务&#xff0c;或深刻的洞见。…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(二)

前言 上篇内容已经介绍接口测试流程以及了解如何用jmeter接口测试&#xff0c;本篇将介绍如何在实战中应用 一、Jmeter接口关联 1.使用正则表达式实现接口关联&#xff08;可以作用于任意值&#xff09; 如果说一个请求里面有多次请求服务器。 2.使用Jsonpath表达式实现接口关…

【CV论文阅读】【计算机视觉中的Transformer应用综述】(1)

0.论文摘要 摘要——自然语言任务的Transformer model模型的惊人结果引起了视觉社区的兴趣&#xff0c;以研究它们在计算机视觉问题中的应用。在它们的显著优点中&#xff0c;与递归网络例如长短期记忆&#xff08;LSTM&#xff09;相比&#xff0c;Transformer能够模拟输入序…

Cocos2dx-lua ScrollView[二]进阶篇

一.概述 本文缩写说明:sv = ScrollView, item代表ScrollView的一个子节点 如果对sv熟系程度还不够,请阅读基础篇: Cocos2dx-lua ScrollView[一]基础篇-CSDN博客 本文介绍sv的一种封装类库,来实现快速创建sv,有如下几个优点: 1.item的位置通过参数控制,提高开发效率…