Flink大状态作业调优——DataStream篇

news2024/9/20 20:14:17

一、Flink 状态(State)简介

  在流式计算中有些操作一次处理一个独立的事件(比如解析一个事件), 有些操作却需要记住多个事件的信息(比如窗口操作)。那些需要记住多个事件信息的操作就是有状态的。流式计算分为无状态计算和有状态计算两种情况。状态可以理解为:历史数据(中间结果)

二、大状态作业导致的问题

   随着作业状态的持续膨胀,多个问题逐步显现,对作业的整体性能产生不利影响:

  1. 性能下降与作业反压:随着有状态算子状态的累积,I/O资源的瓶颈问题日益凸显,引发作业反压。这不仅增加了处理延迟,还导致吞吐量(TPS)降低。
  2. 资源利用效率低下:有状态算子的CPU资源常出现大量闲置,且随着状态规模的增长,资源浪费问题更加严重。
  3. 检查点与快照机制的时效性问题:状态规模的扩大使得检查点和快照过程更易超时,这不仅增加了作业重启后追赶数据的时间成本,也对端到端的 Exactly-once 语义的实现带来了额外延迟。
  4. 启动与扩缩容过程缓慢:在作业启动和扩缩容过程中,每个算子节点需从全量数据中恢复并重建本地数据库,这一过程的时间消耗与状态规模成正比。拥有大状态作业的状态加载往往成为启动和扩缩容执行速度的瓶颈,进而延长业务中断时间。

三、大状态作业诊断调优整体思路

在处理 Flink 作业时,如下这三类问题通常由大规模状态的管理和维护所引起:运行时性能减缓、检查点或快照超时问题以及作业启动和扩缩容过程缓慢。为了优化这些大状态作业,建议遵循以下步骤:

  1. 识别作业瓶颈:通过诊断工具结合具体业务产出情况,对作业目前的运行情况进行更为深入的了解,进而确定作业的性能瓶颈是否与状态管理有关。

  2. 采用更新的引擎版本:Flink在状态模块持续优化,最新版本的引擎通常具有更高的性能。阿里云实时计算的Flink企业版——Ververica Runtime (VVR),与 Apache Flink 完全兼容,并内置了专为流计算优化的状态存储 Gemini。Gemini 针对状态访问进行了设计,有效提升了性能、检查点和作业恢复能力,且参数自适应,无需手动配置。结合实时计算产品,VVR 为用户提供了企业级的优化体验,确保性能达到最佳。在进行性能调优前,请确保已采用最新版引擎和相关配置。

  3. 针对不同问题采取特定调优策略

    (1)运行时性能下降(作业反压):在这种情况下,调优应遵循以下顺序:首先优化SQL层,其次基于TTL(生存时间)减少状态数据,然后调整内存和并发资源以降低磁盘读取频率。

    (2)检查点或快照超时:在处理此类问题时,应先优化作业的运行时性能以减轻反压,接着优化同步阶段的性能,然后调整并发资源以降低单个并发任务的状态量,最后考虑使用原生快照功能来提高效率。

    (3)作业启动和扩缩容缓慢:如果本地磁盘资源充足,可以优先考虑启用状态本地恢复(Local Recovery)功能。同时,利用 Gemini 的懒加载特性和延迟剪裁技术,可以有效提升作业的启动和扩缩容速度。

四、Flink Datastream 作业大状态导致反压的调优原理与方法

4.1  基本原理

   Flink 支持 Operator State 和 Keyed State 两种状态,其中大状态问题通常由 Keyed State 引起。Flink Datastream API 支持通过显式的ValueStateListStateMapState等状态接口来维护 Keyed State,以及为其设置过期时间

4.2  问题诊断方法

  在Flink作业遭遇性能瓶颈时,系统往往表现出明显的反压现象。这种反压可能由多种因素引起,但主要的原因之一是作业状态规模的持续膨胀,直至超出内存限制。此时,状态存储引擎不得不将部分不频繁使用的状态数据移至磁盘,而磁盘与内存在数据存取速度上的巨大差异,使得磁盘 IO 操作成为数据处理效率的瓶颈(RocksDB大状态)。尤其在 Flink 的计算过程中,如果算子频繁地从磁盘读取状态数据,将显著增加作业的延迟,降低整体处理速度,成为性能问题的根源。

4.3 调优方法

4.3.1 反复确认业务逻辑,合理设计状态

   在使用Flink进行状态管理时,首先需要审视业务逻辑,确保只存储必要的数据,避免产生不必要的状态信息。合理设计状态结构和存储内容是控制状态增长的关键所在。仅存储业务所需的最小化状态信息,有利于避免状态的无限增长。

设置合理状态生命周期减小状态大小

  Flink 提供了丰富的状态时间特性,如 ValueStateDescriptor 的 setTTL 方法,可以设置状态的生命周期,确保状态在一定时间后自动过期并被清除。同时,开发者也可以直接调用 clear() 或 remove() 方法,显式删除不再需要的状态条目。合理利用这些特性,可以有效控制状态规模。

4.3.2 使用定时器进行状态清理

  除了依赖状态的时间特性,还可以利用 Flink 的定时器机制,定期触发状态的清理操作。通过设置合理的定时器触发时间,可以确保过期状态及时被清理,避免状态无限增长。这种主动清理状态的方法,可以更精细地控制状态的生命周期。

4.3.3 进行必要的监控与日志输出,同时定期分析状态文件

   在状态管理过程中,需要持续监控状态大小和状态后端的性能指标,及时发现异常情况。同时,记录详细的日志信息,有助于在出现问题时快速定位和解决。除此之外,定期分析状态文件,也能够提供系统运行的历史数据,有助于识别作业模式和预测可能的风险点,为进一步优化状态管理提供依据。

4.3.4 尽可能减少读盘

为了提升系统性能,我们可以通过减少磁盘读取次数并优化内存使用来实现。以下是针对不同情况的具体策略:

(1)优化内存分配:在保证系统总资源不受影响的前提下,我们可以重新分配内存资源,将更多的内存分配给托管内存(Managed Memory)。这样做可以有效提升内存的命中率,从而减少对磁盘的依赖。具体操作时,应确保其他内存资源充足,以免影响系统的其他部分。

(2)细粒度资源配置:在进行资源配置时,应优先考虑增加内存资源。通过为存储引擎分配更多的托管内存,我们可以进一步提高内存命中率,减少对磁盘的读取需求。这种方法在细粒度的资源管理中尤为重要,因为它允许我们更精确地控制资源分配,以达到最佳的性能表现。

(3)提高并发处理能力:通过增加并发处理的数量,我们可以降低单个并发任务的状态量,从而减少需要写入磁盘的数据量。这种方法可以有效地减少磁盘 I/O 操作,提高整体的数据处理效率

参考文章:

Flink⼤状态作业调优实践指南:Datastream 作业篇-阿里云开发者社区

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

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

相关文章

jionlp根据词典进行行政区划补全

背景 需要对地址数据进行行政区划补全的,可以用下面的方法,当然是有条件限制的,只限于提供本省的词典和补全本身的地址数据,否则容易错乱 效果测试 lp = LocationParser() loc = 侨英街道乐海南里170号 res = lp(loc) print(res)1、安装或者更新 python安装 pip insta…

【秋招笔试题】小明的美食

解析&#xff1a;思维题。由于需要互不相同&#xff0c;每次操作取重复的值与最大值相加即可&#xff0c;这样即可保证相加后不会新增重复的值。因此统计重复值即可。 #include <iostream> #include <algorithm>using namespace std; const int maxn 1e5 5; int…

【高中数学/对数函数,指数函数】设方程10^x=|lg(-x)|的两根分别为x1,x1,则以下四选项正确的是? (PS:牛顿中值法失效的案例)

【问题】 设方程10^x|lg(-x)|的两根分别为x1,x1,则以下四选项正确的是&#xff1f; A.x1*x2<0 B.x1*x20 C.x1*x2>1 D.0<x1*x2<1 【解答】 10^x|lg(-x)|的两根&#xff0c;即函数y10^x与y|lg(-x)|的两个交点。 函数y10^x的曲线无须赘述&#xff0c;y|lg(-x)…

C++初阶学习第四弹——类与对象(中)

目录 一. 类的默认成员函数 二.六种默认成员函数 1、构造函数 1.1 构造函数的作用 1.2 特性 1.3 默认构造函数 2、析构函数 2.1 析构函数的作用 2.2 析构函数的用法 3、拷贝构造函数 3.1 拷贝构造函数的作用 3.2 特征 3.3 默认拷贝构造函数 三.总结 类与对象&…

LwIP入门实战 — 1 计算机网络简述

目录 1 计算机网络类别 2 常用网络协议与协议栈 2.1 常用网络协议 2.2 常用TCP/IP协议栈 3 网络协议的分层模型 4 协议层报文间的封装与拆封 5 WAN接口和LAN接口 1 计算机网络类别 广域网WAN(Wide Area Network)&#xff1a;广域网的作用范围通常为几十到几千公里&…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

记录|使用HslCommunication库进行写入Real数据的坑

项目场景&#xff1a; 现在已经通过HslCommunication连接上了PLC&#xff0c;需要对DB1.DBD10的位置处进行数据写入。 问题描述 但是进行将12.2写入指定位置DB1.DBD10时&#xff0c;发现无法从博图中实时检测到数据的写入。 下面是我当时错误的数据写入方法&#xff1a;【主…

Maven实战(一)- Maven安装与配置

Maven实战&#xff08;一&#xff09;- Maven安装与配置 文章目录 Maven实战&#xff08;一&#xff09;- Maven安装与配置1.下载安装包2.配置环境变量。3.安装目录分析4.设置HTTP代理5.镜像 前言&#xff1a; ​ 最近博主看完了《Maven实战》&#xff08;许晓斌著&#xff09;…

iOS collectionView 滑动出现空白

iOS collectionView 滑动出现空白 一个很常见的 banner 轮播&#xff0c;滑动的时候&#xff0c;有时候会出现空白&#xff0c;检查了下&#xff0c;发现代码没什么问题&#xff0c;上网查了也没啥结果&#xff0c;最后的解决方法是自定义layout解决 interface TMLoopViewLayo…

从0到1,AI我来了- (3)AI图片识别的理论知识-I

从上篇文章&#xff0c;我们分析通过Pytorch 封装的各种方法&#xff0c;解读了一遍图片识别训练到测试的流程。 这篇我们从理论上&#xff0c;理解下&#xff0c;图片是如何被识别的&#xff1f; 核心需要理解的内容有&#xff1f; 一张图片&#xff0c;如何被计算机读懂&a…

探索 Python 异步编程的利器:gevent 库

探索 Python 异步编程的利器&#xff1a;gevent 库 第一部分&#xff1a;背景介绍 在现代的软件开发中&#xff0c;异步编程模式因其在处理 I/O 密集型任务时的高效率而越来越受到重视。Python&#xff0c;作为一种动态、解释型的高级编程语言&#xff0c;其原生的异步编程支持…

如何判断IP是否属于网段10.134.208.0/20

首先想要判断IP是否属于网段&#xff0c;我们首先需要了解IP地址的组成结构&#xff1a; 网络IP地址的划分主要包括网络部分&#xff08;网络地址&#xff09;和主机部分&#xff0c;以及一个特殊的地址——广播地址。以下是详细的划分说明&#xff1a; 一、IP地址的组成 每…

中国式浪漫的源头之一:《楚辞》

文章目录 引言亦余心之所善兮,虽九死其犹未悔。惟草木之零落兮,恐美人之迟暮。沧浪之水清兮,可以濯吾缨。悲莫悲兮生别离,乐莫乐兮新相知。苟余心之端直兮,虽僻远其何伤。孰无施而有报兮,孰不实而有获?尺有所短,寸有所长。引言 楚辞中表里俱佳的文字,很有启发性。楚辞…

【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com.

问题 今天jenkins打包一个项目&#xff0c;发现报错了 error An unexpected error occurred: "https://registry.nlark.com/xxxxxxxxxx.tgz: getaddrinfo ENOTFOUND registry.nlark.com". 先写解决方案 把yarn.lock文件里面的registry.nlark.com替换为registry.npmmi…

linux驱动--中断

中断号和中断的申请 中断号的添加-----定义设备节点&#xff0c;描述当前设备 通过设备树文件获取 /dts/xxxx.dts文件中进行设备的设置 在dts设备树文件中进行设备的定义&#xff0c;包括继承的设备&#xff0c;中断号的设置 需要对我们的dts设备树文件进行编译&#xff0…

Flink Doirs Connector 常见问题:Doris目前不支持流读

常见问题 Doris Source 在数据读取完成后&#xff0c;流为什么就结束了&#xff1f; 目前 Doris Source 是有界流&#xff0c;不支持 CDC 方式读取。 问题&#xff1a;对于 Flink Doris DataStream&#xff0c;Flink 想要在 流式读取 Doirs / 实时读 Doris&#xff0c;目前读…

网页的相关概念

什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一页&#xff0c;通常是 HTML 格式的文件&#xff0c;需通过浏览器来阅读。 网页是构成网站的基本元素&#xff0c;通常由图片、链接、文字、声…

MySQL表的增删查改(3)——复杂情况

1. 表的设计 三大范式&#xff1a; 一对一&#xff1a;如一个学生可以有一个学号&#xff0c;一个学号只能被一个学生拥有 一对多&#xff1a;如一个学生只能属于一个班级&#xff0c;但一个班级可以有多个学生&#xff08;这种方案在MySQL中是不可行的&#xff0c;但在有些…

深入浅出mediasoup—关键帧请求

当丢包或者解码错误导致无法正确解码视频流&#xff0c;或者当一个新的接收者加入到视频通话时&#xff0c;需要一个关键帧来恢复和开始正常解码。关键帧请求机制是确保视频流在不可靠网络环境下能够恢复和维持高质量播放的关键技术之一&#xff0c;mediasoup 支持关键帧请求。…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法&#xff0c;不过多介绍&#xff0c;是基于深度学习的目标检测算法中最出名、发展最好的检测器&#xff0c;没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程&#xff0c;详细技术细节不过多介绍&#xff0c;只提及改进点&#xff0c;适合初学者…