flink优化案例

文章目录

  • 一、flink join维表案例
  • 二、flink 双流join案例
  • 三、总结


提示:以下是本篇文章正文内容,下面案例可供参考(适用于flink1.13+)

一、flink join维表案例

  • 背景:flink sql join 维表。job业务不复杂,job写入性能比较差。维表数据大约每天100w条数据(有其他job实时生成维表数据),维表数据只保存近5天数据。
  • job 资源使用情况:TM 1cpu,4Gb内存,1个并行度
  • 性能问题:job每秒写数据慢(已检查:checkpoint生成很快,生成的文件也小)
  • 开始优化
    优化思路:对维表参数的优化参数配置
对定义维表参数的优化参数配置(下面定义维表参数flink官网有参数或类似的参数。提供思路)
  'cache' = 'LRU'  --缓存策略
  'async' = 'true',  
  'cacheEmpty' = 'false',
  'cacheSize'='5000000',  --缓存条数500万条(思路:希望将所有维表数据全部缓存到内存中)
  'cacheTTLMs' = '10800000' --缓存维表时间(缓存3小时,不希望缓存过段或过长导致查源数据库表)

运行后性能比之前没有添加参数要快(相同资源下由4k/s->提升到6k/s)

当以为调优成功时,发现运行一段时间job开始下降。由处理能力6k/s下降到几百条/s,数据有挤压,延时数据开始增大。

之前cpu不变的情况下4Gtaskmanager 内存 30分钟后性能开始下降;
在这里插入图片描述
现在cpu不变的情况下8Gtaskmanager 内存 60分钟后性能开始下降(处理性能下降导致数据开始有堆积);
在这里插入图片描述
后面开始直接对job tm 增加CPU,增加内存都是运行一小段时间,性能还是开始下降.
观察生成的DAG图发现有节点一直处于busy
在这里插入图片描述
继续各种尝试。开始对busy的节点增加并行度(阿里云flink有专家模式支持,flink开源版不支持此功能)
table.exec.split-slot-sharing-group-per-vertex=false
(作业链与处理槽共享组(默认为false),开启后在针对某个操作算子增加并行度和cu等资源时,不与其他槽位共享资源,单独增加额外资源 ###有用的参数)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:a.先优化维表参数,当优化完维表参数后增加资源运行一段时间性能还是下降,开始对节点单独做调整(某个节点性能较弱,单独增加并行度和资源)。如果对整体job添加资源也是可以解决问题,但比较浪费资源。建议针对性能节点单独处理比较好。

二、flink 双流join案例

背景:flink 双流join,处理完后写表,业务逻辑不复杂
问题现象:job 处理性能差,消费数据有大量堆积延时。
表现问题现象:checkpoint 生成很久后失败(或全部失败或频繁失败)
在这里插入图片描述
在这里插入图片描述
可以看下面flink生成的DAG图末尾的sink写表节点已经完全处于卡住状态(0条写入)
在这里插入图片描述

后面对这个job增加资源增加并行度(当分配很少资源时,job运行半天后CP开始一直失败)时,整个job刚开始只能成功创建一个CP后面创建CP全部失败。

  • 调查发现:作业DAG有个SinkMaterializer算子节点(一般双流join会有这个节点,其他操作没有这个节点。且这个节点一直处于busy 如上图),而且检查checkpoint历史时发现该算子state越来越大。
  • SinkMaterializer的算子节点作用:这个算子将输入的记录以upsert key作区分保存到state中,
    并为下游算子提供一个upsert视图。目的:为了解决changelog流事件乱序造成了结果不正确的问题.
  • 问题解决:根据上面查的资料,在根据自己的业务情况(晚来的右表数据大部分是一样的,可以理解一对多,同时即使右表同一个Key下有少量个别字段有少表不一样对业务也不会造成影响)。是可以接受极少异常情况晚来的相同key的值数据。
  • 做法:对job添加参数:table.exec.sink.upsert-materialize=NONE (此参数开源flink,阿里云flink都通用) 运行后作业DAG就没有SinkMaterializer算子节点,且job处理性能极强(tm:1cpu,4Gb 每秒sink接近30k/s)
  • 参数描述 : 由于分布式系统中的 shuffle 会造成 Changelog 数据的乱序,所以 sink 接收到的数据可能在全局的 upsert 中乱序,所以要在 upsert sink 之前添加一个 upsert 物化算子。该算子接收上游 changelog
    数据,并且给下游生成一个 upsert 视图。这个参数用于控制物化算子的添加
  • 注意事项 : A. 默认情况下,在唯一 key 遇到分布式乱序时,该物化算子会被添加,也可以选择不物化(NONE),或者是强制物化(FORCE) B.
    可选值有:NONE、AUTO、FORCE

10分钟内将延时6个小时数据给全部追上(之前没有加那个参数,tm比这个资源配置高,每秒几十条数据,运行半天后job卡住最后0写入)
在这里插入图片描述
在这里插入图片描述

  • 添加完那个参数后CP生成很快很稳定,CP也大幅度变小。再无失败CP.
    在这里插入图片描述

  • 参考:参考1,参考2

  • 小总结:不加那个参数就不会有sink matertilizer那个节点。之前那个节点State比较大,不加的话不会有排序操作,加上的话会把数据缓存下来,修正乱序的问题,所以State会大。

三、总结

  • 上面是两个真实优化案例。优化的方向不同,应该是普通job的优化(维表属性定义和节点调优),一个是有job的写运行机制优化(结合自身业务提升job性能)

CheckPoint说明:
每个需要checkpoint的应用在启动时,Flink的JobManager为其创建一个CheckpointCoordinator,CheckpointCoordinator全权负责本应用的快照制作。

  • CheckpointCoordinator周期性的向该流应用的所有source算子发送barrier;
  • 当某个source算子收到一个barrier时,便暂停数据处理过程,然后将自己的当前状 态制作成快照,并保存到指定的持久化存储中,最后向CheckpointCoordinator报告 自己快照制作情况,同时向自身所有下游算子广播该barrier,恢复数据处理;
  • 下游算子收到barrier之后,会暂停自己的数据处理过程,然后将自身的相关状态制作成快照,并保存到指定的持久化存储中,最后向CheckpointCoordinator报告自身 快照情况,同时向自身所有下游算子广播该barrier,恢复数据处理;
  • 每个算子按照上面步骤不断制作快照并向下游广播,直到最后barrier传递到sink算子,快照制作完成。
  • 当CheckpointCoordinator收到所有算子的报告之后,认为该周期的快照制作成功; 否则,如果在规定的时间内没有收到所有算子的报告,则认为本周期快照制作失败 ;
  • 一旦发生了错误,Flink的JobManager会告诉 task需要从最新的checkpoint中恢复,它可以是全量的或者是增量的。之后TaskManager从分布式系统中下载checkpoint文件, 然后从中恢复状态。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

想半天憋不出几个字?试试AI扩写

大家在写文章时是否也经常这样?想了半天,结果只能写出几个字,但是要求往往又是几百多个字,那么有没有啥工具可以帮我们在原文的基础上扩写一下文章字数,让我们达到字数要求呢? 下面给大家介绍一下如何扩写文…

Microsoft Office for Mac 2024 (Office 365) 16.84 Universal 预览版

Microsoft Office for Mac 2024 (Office 365) 16.84 Universal 预览版 Office LTSC 2024 for Mac 请访问原文链接:Microsoft Office for Mac 2024 (Office 365) 16.84 Universal 预览版,查看最新版。原创作品,转载请保留出处。 作者主页&a…

FullCalendar日历组件集成实战(2)

背景 有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件&#xff0…

Ubuntu安装cmake

在软件开发的世界中,构建系统扮演着至关重要的角色,它们确保代码能够正确、高效地编译和链接。CMake就是这样一个强大的跨平台自动化构建系统,它被广泛用于各种大型项目中。对于Ubuntu用户来说,安装CMake非常简单,而且…

kubeadm 在vubuntu22.04.4 server 上安装kubernetes 1.28.9

一、基础安装(所有节点执行)---------------------------------------- 时间同步 关闭防火墙 sudo ufw disable sudo ufw status关闭交换内存 临时关闭 sudo swapoff -a free -m永久关闭 sudo vim /etc/fstab 注释掉交换内存 转发 IPv4 并让 iptab…

鸿蒙ArkUI开发:常用布局【交叉轴】

交叉轴 垂直于主轴方向的轴线。Row容器交叉轴为纵向,Column容器交叉轴为横向。通过alignItems属性设置子元素在交叉轴(排列方向的垂直方向)上的对齐方式alignSelf属性用于控制单个子元素在容器交叉轴上的对齐方式,其优先级高于al…

4.分支与循环

逻辑控制分为三部分: 1.顺序结构---》顺序执行代码 2.分支结构---》if语句和switch语句 3.循环执行---》for语句 while语句 和do while语句 顺序结构比较简单,按照代码书写的顺序一行一行执行 分支结构(if、switch语句) 也就是…

深度学习之神经网络理论基础

深度学习之神经网络理论基础 人工神经元 人工神经元:人类神经元中抽象出来的数学模型 MP模型 mp模型:1943年心理学家W.S.McCulloch和数理逻辑学家W.Pitts研究出人工神经元,称为M-P模型。 M-P神经元(一个用来模拟生物行为的数学模…

Chromium 调试指南2024 Windows11篇-Visual Studio 2022启用子进程调试插件(六)

1. 前言 在Chromium项目的开发过程中,构建、运行和调试是至关重要的步骤。本文将介绍如何使用Visual Studio 2022打开Chromium项目、启用子进程调试插件、以及编译Chromium项目的流程。通过这些步骤,我们将能够更加顺利地进行Chromium项目的开发和调试工…

深度解析Nginx:高性能Web服务器的奥秘(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、Nginx概述 二、Nginx核心功能 1、URL重写与重…

初识FlaskMySQL实现前后端通信 全栈开发之路——后端篇(1)

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…

拥有一台服务器可以做哪些有趣又实用的事情?

在接触云服务器这个概念你以前,你是不是在想: 可能是,云服务器,这个产品的存在,它可以为你做些什么实用的事情吗? 或者是,云服务器这个看似高大上的科技产品,其实可以为我们的生活…

AI智能体|手把手教你申请一个Kimi(Moonshot)的API KEY

大家好,我是无界生长。 今天分享一下如何申请一个Kimi(Moonshot)的API KEY,为后面Kimi(Moonshot)接入微信机器人做铺垫。学会了的话,欢迎分享转发! 前提 拥有一个Kimi(Moonshot)账号 使用手机号注册即可,新用户可免费…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑协变量因素的多能微电网两阶段分布鲁棒优化调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

ARM架构安全特性之标准安全 API

安全之安全(security)博客目录导读 目录 一、机密计算软件 二、Arm机密计算固件架构 三、认证校验 四、Veraison项目 五、独立于语言的安全API 六、平台抽象安全项目(Platform AbstRaction for SECurity project) 七、可移植平台安全API 八、…

黄仁勋炉边对话:创业的超能力与英伟达的加速计算之旅

在TiECon 2024大会上,英伟达的创始人兼CEO黄仁勋与风投公司Mayfield的管理合伙人纳文查德哈进行了一场深入的炉边对话。黄仁勋不仅分享了英伟达的创业故事,还谈到了他对创业和加速计算的深刻见解。下面是我对这次对话的总结,希望能给正在创业…

10.nginx模板(开启监控取值页面)

nginx模板(开启监控取值页面) 1.开启监控页面 vim nginx.conflocation /nginx_status {stub_status;} systemctl restart nginx.server网页展示 导入模板&#xff0c;nginx监控模板zbx_nginx_template.xml <?xml version"1.0" encoding"UTF-8"?…

高级查询(子查询)

可以使用的范围&#xff1a; 子查询是一个嵌套在SELECT、INSERT、UPDATE、DELETE语句或其他子查询中的查询。 任何允许使用表达式的地方都可以使用子查询。 子查询也称为内部查询或内部选择&#xff0c;而包含子查询的语句也称为外部查询或外部选择 子查询的特点和优势 可以…

(undone) 什么是马尔可夫链?Markov Chain

参考视频1&#xff1a;https://www.bilibili.com/video/BV1ko4y1P7Zv/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考视频2&#xff1a;https://www.bilibili.com/video/BV1xg4y1K7z4/?spm_id_from333.788&vd_source7a…

js前端获取农历日期

对于公历来说&#xff0c;直接 new 一个 Date 就能获取到&#xff0c;而对于农历来讲可就很难了&#xff0c;因为农历需要有许多复杂计算&#xff0c;虽然一般用的甚少&#xff0c;但对于某些场景来说还是会需要的&#xff0c;那么怎样获取农历日期呢&#xff1f; 这里推荐一个…