Flink⼤状态作业调优实践指南:状态报错与启停慢篇

本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富,本文分享终篇状态报错与启停慢篇,主要分为以下四个部分:

  1. 检查点和快照超时的诊断与调优

  2. 作业快速启动和扩缩容方案

  3. 总结

  4. 阿里云企业级存储后端Gemini 特点补充介绍

前篇:Flink⼤状态作业调优实践指南:Datastream 作业篇

中篇:Flink⼤状态作业调优实践指南:Flink SQL 作业篇

Tips:点击「阅读原文」跳转阿里云实时计算 Flink~

检查点和快照超时的诊断与调优

6.1 运行原理

Flink 的状态管理核心机制依赖于 Chandy-Lamport 算法,以确保数据的一致性和可靠性。在此框架下,检查点和快照的执行过程可以概括为两个主要阶段:

(1)同步阶段:此阶段的关键在于 Barrier 的对齐和同步资源的维护。Barrier 作为一种特殊的数据记录,在算子之间传递时,其对齐的时间与数据记录的延迟成正相关关系。

(2)异步阶段:在这一阶段,算子将本地状态信息上传至远程的持久化存储系统。上传时间的长短与状态数据的大小直接相关。

当 Flink 作业面临反压问题时,同步阶段的执行可能会变得缓慢,从而导致检查点和快照超时。因此,在遇到检查点和快照超时问题,并且监测到作业存在反压时,首先应当参考 Flink 的“运行时性能调优策略”,优先解决反压问题,以提高作业的整体效率和稳定性。

6.2 问题诊断方法

在解决反压问题后,若检查点与快照仍出现超时现象,首先应分析同步阶段的对齐时间是否过长,随后考虑是否由庞大的状态数据引起。

■ Checkpoint UI

通过这个UI,用户可以详细分析检查点和快照超时原因,具体操作如下:

在 “作业探查 - Checkpoints - Checkpoints 历史” 页面,可以在不同级别(作业、算子、单并发)观察 Checkpoint 指标,我们着重观察超时的 Checkpoint 的异常算子或正在进行的 Checkpoint 的算子:

(1)其 “Sync Duration” 和 “Alignment Duration” 是否较长,如是,则基本判定有瓶颈在同步阶段上,需要优先解决同步阶段问题

(2)其 “Async Duration” 是否较长,以及其 “Checkpointed Data Size” 是否较大,如是,则可基本判定其瓶颈在异步阶段状态上传上

图片

■ Checkpoint 指标

用户通过查看监控指标中 lastCheckpointDuration 和 lastCheckpointSize 来粗粒度分析历史 Checkpoint 的耗时和大小。

6.2 调优方法

在进行性能调优之前,首先要确保运行时性能达到预期。如果当前性能水平不足,应优先根据“运行时性能优化指南”进行调整。在满足基本性能要求后,为了进一步提高检查点和快照的效率,可以考虑以下三种策略:

(1)使用 Unaligned Checkpoint 和 Buffer Debloating:这一方法可以有效解决因等待数据对齐而导致的超时问题,适用于各种规模的作业,这里仅作简要介绍)

(2)增加运行时的并发资源:通过增加并发资源,可以减少单个并发任务的状态量,从而加速异步快照的处理流程。

(3)使用原生快照:相比标准快照,原生快照生成速度更快,存储占用更小。

使用场景方案实践方式注意事项
检查点或快照同步超时使用 Unaligned Checkpoint 和 Buffer Debloating运行参数中配置参数,可参考[8]
检查点或快照异步超时增加并发在资源配置或细粒度资源配置中增加并发[7]
快照异步超时使用原生快照对运行中的作业,选择 “创建快照” - “原生格式” 即可[9]原生快照无法保证跨大版本兼容

 Unaligned Checkpoint 和 Buffer Debloating的使用和介绍可以参考以下帖子

Flink Aligned Checkpoint和Unaligned Checkpoint原理详解-CSDN博客

一文搞懂 Flink 网络流控与反压机制_flink kafka 反压-CSDN博客

作业快速启动和扩缩容方案

7.1 运行原理

在进行作业恢复时,从检查点或快照中恢复相较于无状态启动,关键在于高效地从远程持久存储中下载状态文件并重建状态引擎。这一步骤需要执行大量的输入输出操作,容易成为恢复过程中的效率瓶颈,可能会造成作业的长时间停滞。

7.2 问题诊断方法
在作业启动或进行扩容操作期间,若发现作业长时间停留在初始化阶段,应首先诊断是否存在初始化瓶颈。以下是推荐的诊断与优化步骤:

(1)使用诊断工具分析算子状态:利用“线程转储”、“线程动态分析”和“火焰图”等工具,检查初始化阶段的算子线程栈。重点关注线程栈是否长时间处于等待状态,尤其是在Gemini等状态存储系统上的操作。

(2)识别状态算子的初始化问题:如果发现某个算子长时间处于初始化状态,且该算子涉及状态处理,那么可以推断问题可能出在状态的下载或重建过程中。

一旦确定作业初始化的瓶颈与大状态处理有关,接下来应参考后续章节提供的优化策略进行针对性调整。通过这些方法,可以有效地识别并解决作业初始化过程中的瓶颈问题,从而提高作业的运行效率和稳定性。

7.3 调优方法

为了优化作业启动和扩容效率,我们提供了两种高效策略:

(1)Local Recovery:本地恢复技术,通过在本地同时存储快照,减少恢复过程中的数据下载需求。在本地磁盘空间充裕的情况下,这是首选方案。

(2)Gemini 智能懒加载和延迟剪裁:作为平台核心技术Gemini,即使面对大规模状态的作业,也能仅通过下载必要的元数据快速启动,实现对用户数据的即时处理。随后,系统将通过异步下载和智能裁剪技术,有效处理远程检查点文件,显著降低作业中断时间,提升效率超过90%。

方案实践方式注意事项
Local Recovery:本地备份快照加速恢复运行参数中配置:state.backend.local-recovery: true [10]适用于作业 Failover 或者动态参数更新的场景,手动停止重启无法生效会多占用部分本地磁盘资源
Gemini 智能懒加载和延迟剪裁:异步状态恢复方案运行参数中配置:state.backend.gemini.file.cache.download.type: LazyDownloadOnRestore作业刚启动后的一小段时间内,会异步下载状态文件,作业性能逐步恢复,因此一开始性能会稍微低一些

总结

在上中下篇章中,我们深入探讨了Apache Flink中的状态管理机制,以及当一个作业持有大状态时在阿里云实时计算Flink版中的如何进行问题诊断和优化。Flink的状态管理是一个复杂而关键的领域,涉及到作业的性能、稳定性和资源利用等多个方面。通过对这些机制分析和优化策略的深入理解和正确应用,结合阿里云Flink提供的产品能力,希望用户可以有效地优化Flink作业,应对大规模状态作业带来的挑战,实现更高效、更可靠的实时数据处理。

附录1:阿里云企业级存储后端Gemini 特点补充介绍

GeminiStateBackend是一款面向流计算场景的KV存储引擎,作为实时计算Flink版产品的默认状态存储后端(StateBackend)。其针对流计算场景进行了全新的架构和数据结构设计,Gemini 在大状态作业下也有良好的表现,其具备如下优势特点:

性能卓越:在 Nexmark 测试中,Gemini 所有用例的性能都比 RocksDB 更优,其中约一半用例的性能领先 RocksDB 70%以上。目前在阿里巴巴集团内部的实时计算平台和公有云的实时计算Flink服务中,共计超 50WCU 的有状态作业使用 Gemini 存储引擎,其中也包含了数十 TB ~ 上百 TB 的大状态作业,助力实时计算用户高效完成业务目标。

自适应 KV 分离,极大优化大状态下双流/多流 Join 性能:Stateful Join 算子利用状态存储明细数据,因此是大状态作业的常客。基于大量场景 Join 成功率较低、或者状态数据Value较长的特点,Gemini 推出了 KV 分离的能力从而极大优化这些场景下的性能。在 Nexmark 双流 Join 的测试中,作业吞吐能力可以提升50% ~ 70% 以上,且该功能可以完全自适应调整,不需要用户额外配置调优。

轻量级 Snapshot,显著加速大状态作业检查点和快照完成:Gemini 通过支持更细粒度的 Snapshot,同时解耦检查点与 LSM 的 Compaction 机制,让检查点和快照变得更加稳定快速。此外,Gemini 通过支持 Native Incremental Savepoint,结合实时计算产品提供了原生快照,让其性能趋近检查点,极大提高了快照可用性。

三篇综合参考文献

[1] 深入分析 Flink SQL 工作机制:

https://developer.aliyun.com/article/765311

[2] 在使用 EvenTimeTemporalJoin 时不会产生 ChangelogNormalize,详见 FLINK-29849:

https://issues.apache.org/jira/browse/FLINK-29849

[3] Flink SQL Secrets: Mastering the Art of Changelog Event Out-of-Orderness:

https://www.ververica.com/blog/flink-sql-secrets-mastering-the-art-of-changelog-event-out-of-orderness

[4] 如何消除流查询的不确定性影响:

https://nightlies.apache.org/flink/flink-docs-release-1.18/zh/docs/dev/table/concepts/determinism/#33-如何消除流查询的不确定性影响

[5] 高性能 FlinkSQL 优化技巧:

https://help.aliyun.com/zh/flink/user-guide/optimize-flink-sql?spm=a2c4g.11186623.0.0.2790ff53sQpyuy

[6] taskmanager.memory.managed.fraction 配置说明:

https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/config/#taskmanager-memory-managed-fraction

[7] 作业资源配置方式:

https://help.aliyun.com/zh/flink/user-guide/configure-deployment-resources

[8] Unaligned Checkpoint 和 Buffer Debloating 使用方式:

https://nightlies.apache.org/flink/flink-docs-

master/docs/ops/state/checkpointingunderbackpressure

[9] 原生快照使用方式:

https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/checkpointingunderbackpressure

[10] Local Recovery 配置说明:

https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/config/#state-backend-local-recovery

[11] 状态相关介绍:

https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/dev/datastream/fault-tolerance/state/#operator-state

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

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

相关文章

creo学习一

设置好当前配置后,导出config配置文件,并覆盖掉此路径下的旧文件,使得新配置永久生效,这样每次打开软件都是新配置的设置: 系统颜色的导出: 打开版本的问题: 不能有弱尺寸: 注意&a…

分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

前言 日志在软件开发中扮演着非常重要的角色,通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息,帮助在调试和排查问题时更快速地定位和解决 Bug。 通过日志,我们可以做到: 故障排除和调试&#xff…

【经验总结】ECU休眠后通过一帧NM报文唤醒ECU后在要求时间内通过第二帧NM报文需要唤醒网络

目录 前言 环境 1.需求描述 2.测试方法 3.完成需求的方法 4.原理详解 4.1 CanTrcv 接收到第一帧NM报文 4.2 EcuM接收到唤醒事件 4.3 CanTcv接收到第二帧NM报文 4.4 EcuM完成唤醒源校验 5. 总结 前言 关于CAN收发器参与下的ECU休眠唤醒问题我们已经写过很多文章,&l…

【C#/C++】C++定义一个返回uchar*的函数,调用函数时接收的数据异常

C定义一个返回uchar*的函数,调用函数时接收的数据异常 1、场景2、错误代码3.正确写法 1、场景 我是想实现一个图像畸变矫正的函数,由于相机的硬件原因(相机内外参数,视野)会导致我们取到的图有一定程度的畸变&#xff…

Reinforcement Learning学习(三)

前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…

MySQL普通表转换为分区表实战指南

码到三十五 : 个人主页 引言 本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表。分区表在处理庞大数据集时展现出显著的性能优势,不仅能大幅提升查询速度,还能有效简化数据维护工作。通过掌握这一技巧能够更好地应对数据密集型应…

《编程小白变大神:DjangoBlog带你飞越代码海洋》

还在为你的博客加载速度慢而烦恼?DjangoBlog性能优化大揭秘,让你的网站速度飞跃提升!本文将带你深入了解缓存策略、数据库优化、静态文件处理等关键技术,更有Gunicorn和Nginx的黄金搭档,让你的博客部署如虎添翼。无论你…

解决阿里云的端口添加安全组仍然无法扫描到

发现用线上的网站扫不到这个端口,这个端口关了,但是没有更详细信息了 我用nmap扫了一下我的这个端口,发现主机是活跃的,但是有防火墙,我们列出云服务器上面的这个防火墙list,发现确实没有5566端口 参考&a…

大数据解决方案案例:电商平台日志分析

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

AI作画工具介绍

目录 1.概述 2.Stable Diffusion 2.1.诞生背景 2.2.版本历史 2.3.优点 2.4.缺点 2.5.应用场景 2.6.未来展望 3.Midjourney 3.1.诞生背景 3.2.版本历史 3.3.优点 3.4.缺点 3.5.应用场景 3.6.未来展望 4.总结 1.概述 AI作画工具是一种运用人工智能技术&#xff…

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间…

require.context()函数介绍

业务需求&#xff1a; 前端Vue项目怎样读取src/assets目录下所有jpg文件 require.context()方法来读取src/assets目录下的所有.jpg文件 <template><div><img v-for"image in images" :src"image" :key"image" /></div> …

代码随想录打卡第一天(补)

数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 704. 二分查找 最简单的二分思想的应用&#xff0c;主要锻炼写两种方法 两种方法的区别就是&#xff1a;右指针的每次变化&#xff0c;可能还有就是最后找到目标值后的一个下标到底是什么 二分思想&#xff1…

Python实现Stack

你好&#xff0c;我是悦创。 Python 中的栈结构是一种后进先出&#xff08;LIFO, Last In, First Out&#xff09;的数据结构&#xff0c;这意味着最后添加到栈中的元素将是第一个被移除的。栈通常用于解决涉及到反转、历史记录和撤销操作等问题。在 Python 中&#xff0c;你可…

九、C语言:隐式类型转换(整型提升与算数转换)

一、隐式类型转换 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 二、整型提升 //1.表达式的整型运算要在CPU的相应运算器件内执行&#xff…

I/O 设备与设备控制器

目录 I/O 设备 1. 键盘和鼠标 2. 显示器 3. 磁盘 4. 打印机 5. 网络适配器 设备控制器 1. 数据传输 2. 缓冲管理 3. 中断处理 4. 设备初始化 5. 错误检测与恢复 6. 设备控制器的组成部分 7. 示例图解 内存映像 I/O 原理 优点 实现方式 应用场景 I/O 通道 I…

Nginx 精解:正则表达式、location 匹配与 rewrite 重写

一、常见的 Nginx 正则表达式 在 Nginx 配置中&#xff0c;正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例&#xff1a; 当涉及正则表达式时&#xff0c;理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子&#xff1a; ^&#xff1…

langchainJS -结构化输出(StructuredOutputParser )

在LangChain的帮助下&#xff0c;我们可以为输出定义模式。StructuredOutputParser 使用定义的名称和描述来分析和构建模型预测的输出。 const productParser StructuredOutputParser.fromNamesAndDescriptions({Name: "Name of The Product",Description: "De…

JS中split的用法

在JavaScript中&#xff0c;split() 方法用于将字符串分割成字符串数组&#xff0c;并返回这个数组。该方法接受一个参数&#xff0c;该参数定义了用于分割字符串的字符或正则表达式。 以下是一些使用 split() 方法的示例&#xff1a; 示例 1&#xff1a;使用字符串作为分隔符…

【笔记2】Python编程:从入门到实践(第2版) - 埃里克·马瑟斯

第二部分 1、外星人入侵 Pygame包 2、数据可视化 Matplotlib 、Plotly 3、Web应用程序 Django 项目1&#xff1a;外星人入侵 第12章&#xff5e;第14章 使用Pygame包来开发一款2D游戏。 它在玩家每消灭一群向下移动的外星人后&#xff0c;将玩家提高一个等级。等级越高&…