Flink-状态流与容错

news2025/2/23 18:28:30

状态流与容错

  • 一、状态概念
  • 二、状态实现
    • 1.状态触发
    • 2.状态存储实现
      • 2.1 HashMapStateBackend
      • 2.2 EmbeddedRocksDBStateBackend
      • 2.3 状态存储对比
    • 3.设置状态存储实现
      • 3.1 单个作业设置
      • 3.2 全局设置
  • 三、容错机制
    • 1.状态快照
    • 2.状态快照生成
    • 3.Checkpoint Barrier
    • 4.Aligned Checkpointing
    • 5.Unaligned Checkpointing
  • 总结
    • 参考链接


一、状态概念

在流处理中有很多操作只依赖独立的事件即可,有的操作不仅需要依赖当前事件还要依赖前序事件。这样flink的算子就分为无状态算子和有状态算子。

  • 无状态算子:算子对事件处理是独立的,每个事件是没有任何关联的,每个事件可以被单独处理和操作。例如:map、fliter等操作
  • 有状态算子:算子对事件处理还依赖于之前事件的处理结果。因此还需要维护和保存算子的中间处理结果。例如聚合、去重等操作。

flink对算子的状态保存不仅可以实现更多高级特性,还可以通过状态的保存和恢复来实现容错。

二、状态实现

1.状态触发

Flink程序保存状态的场景主要有以下三种:

  • 窗口函数:在windows触发之前需要收集或者聚合事件,此时需要保存事件或者中间结果。
  • 转化函数:会使用key/value格式的状态接口来存储状态。
  • 转化函数:实现CheckpointedFunction接口,接受到barrier时触发checkpoint机制。

2.状态存储实现

Flink内置了两个状态存储实现HashMapStateBackend和EmbeddedRocksDBStateBackend,默认使用HashMapStateBackend。

2.1 HashMapStateBackend

状态数据以Java对象的形式存储在JVM堆中,状态快照可以持久化到文件系统或者Job Manager的堆中。

  • 较大state、较长windows和较大key/value状态的job
  • 基于堆内存效率高,吞吐量大
  • 受限于内存大小

2.2 EmbeddedRocksDBStateBackend

状态数据被序列化成字节数组的方式存储在RocksDB数据库中,数据库默认将数据存储在TaskManager的数据目录。采用异步方式生成状态快照。

  • 非常大state、超长windows和大量key/value状态的job
  • 受限于磁盘空间大小
  • 读写状态数据需要经过序列化、反序列化操作效率低,吞吐量小
  • 支持增量状态快照

2.3 状态存储对比

flink程序选择状态存储实现就是在性能与可拓展性之间的权衡。
HashMapStateBackend由于状态的读写都是在java的heap上操作因此速度快,但状态大小受限于集群中可用内存。
EmbeddedRocksDBStateBackend可以根据可用disk进行空间拓展,并且支持增量状态快照。但由于读写都需要反序列化因此比HashMapStateBackend慢一个数量级。

3.设置状态存储实现

3.1 单个作业设置

StreamExecutionEnvironment 可以对每个 Job 的 State Backend 进行设置,如下所示

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new HashMapStateBackend());

3.2 全局设置

在 flink-conf.yaml 可以通过键 state.backend.type 设置默认的 State Backend。

# 用于存储 operator state 快照的 State Backend
state.backend: hashmap
# 存储快照的目录
state.checkpoints.dir: hdfs://namenode:40010/flink/checkpoints

三、容错机制

flink容错机制就是针对算子和数据流进行持久化快照。当程序发生故障时,flink可以根据快照将应用程序的状态完整的恢复并处理。

1.状态快照

快照时flink作业状态一致性景象。快照包括每个数据源的指针以及作业每个状态运算符的状态数据,状态数据是指处理了数据源偏移位置之后的所有事件后生成的状态。
快照分为CheckPoint和SavePoint两种:

  • CheckPoint:一种由Flink自动执行的快照,用于从故障中恢复。
  • SavePoint:用户出于某种操作目的例如重新部署、升级等操作,手动触发快照。

2.状态快照生成

最简单的想法就是 同一个时间点 所有节点停止处理 然后将状态和上游通道中的事件保存下来。但是由于是分布式节点协调同一个时间点比较难,完全停止也影响实时性。
根据批处理经验,可以将实时流处理一段流之后,停止读取,等待所有节点处理完毕之后,这样只需要保存实时流的位置和所有节点的状态即可。这样如果想要重放只需要将所有节点状态恢复,并按照原有位置读取实时流即可。
按照上边思路,上游节点保存完状态后需要等待最后一个节点处理完成才能处理新数据。如果处理流程越长,保存快照的时间就会越长,最后导致计算资源利用率低。其实仔细思考一下如果当前节点保存完快照,完全可以继续处理接下来的事件,因为并不会影响本节点已经生成的状态快照。

Flink采用的就是类似的想法进行快照的处理,首先会在事件流中插入barrier将实时流逻辑上分割成多个有限流。当算子接受到barrier时需要执行快照生成,然后将barrier广播给下游算子。当需要恢复时,重新部署服务,从快照中把每个算子的状态恢复,然后从barrier处重新读取源数据即可。

3.Checkpoint Barrier

JobManager会告知TaskManager需要进行状态快照生成时,TaskManager会记录Sources的偏移量,并且将Checkpoint barrier插入到事件流中。
在这里插入图片描述
其中状态快照n将包含偏移量以及每个算子的状态,状态是指此算子消费了barrier n之前所有事件、但是不包含barrier n之后的任何事件生成的状态。

当处理拓扑图中的每个算子接受到barrier时,会进行快照生成,然后上报JobManager。当所有算子都完成快照生成并上报后,就标志着本次快照生成完成。
在这里插入图片描述

4.Aligned Checkpointing

如果算子有多个输入,那么每个输入的barrier不可能同时抵达算子,这种情况需要等待所有输入的barrier都到达才能进行快照生成,也就是需要barrier对齐。
在这里插入图片描述

  1. 当算子从一个输入中收到barrier时,就会停止处理这个输入的后续数据,将后续数据缓存到input buffer中。
  2. 当算子收到了最慢输入流中的barrier时,就会向下游广播此barrier。
  3. 算子执行快照生成操作,然后重新开始处理buffer中缓存起来的输入流,然后再从输入管道中获取数据处理。

5.Unaligned Checkpointing

如果作业中有的数据流处理较慢,会导致barrier传递变慢,一次完整的快照生成会耗时很多。而且会导致反压,因此引入了非对齐barrier。
在这里插入图片描述

  1. 当算子其中一个输入流中的barrier到达输入缓冲区时,算子停止进行逻辑处理。
  2. 算子会立刻讲这个barrier输出到输出缓冲区最前端。
  3. 算子将当前算子状态、当前输出缓冲区和所有输入流barrier还没有被算子处理的数据进行快照。由于其他输入流的barrier还没有到达算子,所以快照处理是异步处理。

当非对齐barrier恢复现场时需要将算子状态、输出缓存、未对齐的输入流都需要恢复到对应链路中,这三者合并起来就能保证当时状态的还原。

总结

主要介绍了flink算子分为有状态算子和无状态算子。状态存储实现一个是直接保存对象,另一个保存字节数组。容错机制主要是将实时流逻辑分段进行所有算子的状态保存和恢复来实现容错。


参考链接

1.Flink State Backend
2.Flink Stateful Flow

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

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

相关文章

“批量随机重命名文件夹,自定义长度,一键轻松搞定!“

您是否曾经因为文件夹命名重复或毫无特色而烦恼?现在,我们为您推荐一款全新的文件夹批量随机重命名工具,它可以轻松解决您的问题! 首先第一步,我们要打开文件批量改名高手并登录账号。 第二步,在进入主页面…

L1-016:查验身份证

题目描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2&#xf…

webGL开发虚拟实验室技术方案

开发虚拟实验室涉及到模拟实际实验环境和过程,同时提供用户互动性和学习体验。以下是一个可能的技术方案,用于实现这样的虚拟实验室,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合…

面向注解编程—Spring 注解看这一篇就够了

面向注解编程—Spring 注解大全之IOC篇 Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,调用的时候直接注入即可,使用注解可以大大提高了开发效率!。 Bean英文意为 豆子 理解起来就是豆荚里的豌豆,豆荚就是…

记一次使用Java8新特性中的parallelStream⭐️数据流引发的接口异常以及解决方法

目录 前言 正文 代码 分析 问题解决 总结 前言 小伙伴们大家好,分享下开发过程中最近遇到的坑,根据新需求,项目的一处模块需要改动,大致说下该模块的流程。。。好像之前有讲过,翻翻看,…

Linux4.8、环境变量续

个人主页:Lei宝啊 愿所有美好如期而遇 前言 如果对环境变量没有基本的理解,那么建议先看完这篇文章:环境变量https://blog.csdn.net/m0_74824254/article/details/134661113?spm1001.2014.3001.5501 环境变量与本地变量区别 使用export设…

response应用

文章目录 [TOC](文章目录) response说明一、response文件下载二、待补充。。。 response说明 response是指HttpServletResponse,该响应有很多的应用,比如像浏览器输出消息,下载文件,实现验证码等。 一、response文件下载 1.创建一个javaw…

跨境代采怎么实现(代采网站)

中国代购作为一种新型的业务形式,此类服务能够帮助消费者购买来自全球的商品,同时也为商家提供了在线销售机会。代购行业的兴起,有助于打破传统的地域和跨境限制,促进了国际贸易和经济发展。 一、中国代购的定义和特点 代购可以被…

基于SpringBoot实现的电影院售票系统

一、 系统架构 前端:html | jquery | bootstrap 后端:springboot | thymeleaf | spring-data-jpa 环境:jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 首页 02. 登录页 03. 管理端-电影列表 04. 管理端-添加电影 05. 管…

【EI会议征稿中】第五届人工智能与机电自动化国际学术会议(AIEA 2024)

第五届人工智能与机电自动化国际学术会议(AIEA 2024) 2024 5th International Conference on Artificial Intelligence and Electromechanical Automation 第五届人工智能与机电自动化国际学术会议(AIEA 2024)将于2024年3月8-10…

3 数据库

目录 一、数据库的基本信息 1.1 数据库的定义 1.2数据库的分类 1.2.1 关系型数据库 1.2.2 非关系型数据库 1.3 SQL介绍 1.3.1 概念 1.3.2 SQl语言分类 1.3.3 SQL注释 1.3.4 数据库操作命令DDL 1.3.5 数据表操作命令DDL 1.3.6 数据表操作命令DML 1.3.7 数据表中内容…

2023跳槽最新面试题整理:软件测试面试题(附带答案)备战面试...

混迹于软件测试行业十几年了,在面试经验方面也是比较有经验,那么也整理过很多面试题,今天暴露给大家看看,学习学习! 测试面试一般从以下三大方向蹂躏面试者: 1、基本素养–比如沟通方向的考察&#xff0c…

同城上门洗鞋店小程序,打破传统洗鞋店新模式

同城洗鞋,一种把传统洗鞋和互联网结合的新兴服务,它让洗鞋更便捷、品质更高。你不用再为排队等待而烦恼,只需在家预约,我们的服务人员就会按时上门取鞋,进行初步清洗和检查。根据鞋子材质和污渍程度,选择合…

Java网络编程——基础入门

1、进程间的通信 进程指运行中的程序,进程的任务就是执行程序中的代码。EchoPlayer类是一个独立的Java程序,它可以在任意一台安装了JDK的主机上运行: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

【EI会议征稿中|航空航天领域】第二届航空航天与控制工程国际学术会议(ICoACE 2023)

第二届航空航天与控制工程国际学术会议(ICoACE 2023) 2023 2nd International Conference on Aerospace and Control Engineering 2023年第二届航空航天与控制工程国际学术会议(ICoACE 2023)将于2023年12月15-17日在江苏南京召开…

性能测试计划怎么编写

一.简介 简介部分就不用过多描述了,无非项目的背景,进行此次性能测试的原因,以及性能测试覆盖的范围等等,几乎所有项目文档都在开端对项目进行简单的阐述。 二.性能测试需求 寻找的被测试对象和压力点 …

蓝桥杯算法心得——想吃冰淇淋和蛋糕(dp)

大家好,我是晴天学长,dp题,怎么设计状态很重要,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .想吃冰淇淋和蛋糕 想吃冰淇淋与蛋糕 输入格式 第一行输入一个整数n。…

python文件操作知识

【一】操作流程: 打开文件,得到一个文件句柄(对象),赋给一个对象。通过文件句柄对文件进行操作。关闭文件。 【 二 】 使用方法 open(路径 文件名,读写模式) 如下: …

Netty02-基础概念

什么是netty ​ Netty是一个基于Java NIO的异步事件驱动网络应用程序框架。它提供了简单易用的API,用于快速开发可维护的高性能网络应用程序。Netty的设计目标是提供一种高度可扩展的、高性能的网络应用程序框架,使得开发人员能够轻松地构建各种类型的网…

unity | 动画模块之循环滚动选项框

一、作者的话 评论区有人问,有没有竖排循环轮播选项框,我就写了一个 二、效果动画 如果不是你们想要的,就省的你们继续往下看了 三、制作思路 把移动分成里面的方块,还有背景(父物体),方块自…