Flink 批作业如何在 Master 节点出错重启后恢复执行进度?

news2024/11/25 14:37:38

本文撰写自阿里云研发工程师李俊睿(昕程),主要介绍 Flink 1.20 版本中引入了批作业在 JM failover 后的进度恢复功能。主要分为以下四个内容:

  1. 背景

  2. 解决思路

  3. 使用效果

  4. 如何启用

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

01

背景

在 Flink 1.20 版本之前,如果 Flink 的 JobMaster(JM)发生故障导致被终止,将会发生如下两种情况:
  • 如果作业未启用高可用性(HA),作业将失败。

  • 如果作业启用了 HA,JM 会被自动重新拉起 (JM failover)。在这种情况下,流作业将从最后一个成功的检查点恢复。然而,批作业由于缺乏检查点机制,将不得不从头开始运行,导致之前的所有进度丢失。这对于需要长时间运行的批作业来说,意味着巨大的回退。

为了解决这一问题,我们在 Flink 1.20 版本中引入了批作业在 JM failover 后的进度恢复功能。这一功能的目的是使批作业在 JM failover 后能够尽可能地恢复到出错前的进度,避免重新运行已完成的任务。

02

解决思路

为了实现这一目标,我们需要能够将 JM 的状态持久化到外部存储,从而在 JM 发生 failover 后,Flink 能够利用这些状态信息恢复作业到之前的运行进度。

我们设计了一种基于事件的 JM 状态恢复机制,在作业正常运行时,JM 会将状态变更事件写入外部持久化存储,以确保在 JM failover 后仍能获得作业的执行进度。此外,我们还需要解决 JM failover 后实际作业状态与状态变更事件可能不一致的问题。例如,某些 TaskManager (TM)在运行过程中意外丢失,可能导致中间数据结果无法访问。因此,Flink 必须从 TM 和 Remote Shuffle Service (RSS)获取中间结果数据的信息,来对作业运行进度的恢复结果进行校准。

该功能的整体流程分为如下几个阶段:

2.1 作业执行时

我们引入了 JobEventStore 组件,该组件负责在作业正常运行期间将 JM 的状态变更事件写入到外部文件系统中。其中需要被写入的状态变更事件分为如下以下几类:

(1)自适应执行计划优化:Flink 会自适应地优化批作业的执行计划,这些优化结果是基于上游的执行结果来确定的。如果每次都依赖上游的执行结果进行重建,将会产生较大的开销。因此,记录这些优化结果对于任务调度和容错非常重要。

(2)已经结束的 Task 信息:保存已完成任务的执行进度,以便在恢复作业时能够准确地继续从上次执行的位置开始。

(3)OperatorCoordinator 状态:OperatorCoordinator 负责协调算子,实行算子之间的通信,其状态与数据一致性密切相关。例如,SourceCoordinator 中包含记录哪些数据分片已经分发的状态信息。重建该组件的状态有助于保证数据的一致性。

(4)ShuffleMaster 状态:Flink 目前支持 RSS,而 RSS 的 Shuffle Master 可能会保存一些状态信息,如 Shuffle 数据的元数据。为了使新的 JobManager 能够复用这些中间结果,恢复 Shuffle Master 的状态是必不可少的。

8aa39891f50c5f5ed30da8fdadb10e98.png

2.2 JM failover 期间

Flink 批作业在运行过程中,其中间结果数据会保存在 TM 上和 RSS 上。当 JM 发生故障时,TM 和 RSS 将保留与作业相关的中间结果数据,并不断地尝试重新连接到 JM。一旦新的 JM 重新被拉起来后,TM 和 RSS 将重新与 JM 建立连接,然后 TM 和 RSS 会主动上报它们持有的中间结果数据。

d8e78e4f8c86ae8f7e8edabb8c156b26.png

2.3 JM failover 后的作业进度恢复

一旦 JM 重启,它会与 TM 和 RSS 重新建立连接,利用 JobEventStore 中记录的事件以及 TM 和 RSS 保留的中间结果数据,来重建作业的执行进度。

JM 首先会利用 JobEventStore 中记录的事件,恢复作业各个节点的执行状态。

然后根据 OperatorCoordinator 的状态,JM 会恢复尚未处理的 Source 数据分片,以避免数据丢失或重复。

随后,JM 将根据汇报上来的可用中间数据进一步校正执行进度。如果某个 task 产生的中间数据丢失,但这些数据仍被下游 task 所需要,那么该 task 将被重置并重新执行。

最后作业将从恢复出来的进度继续执行。

df6da5170c86895b4ea4f9fa413a467a.png

03

使用效果

以下是一个 JM 出错重启后进度恢复的效果示例。

该批作业的拓扑结构为 Source -> Map -> Sink ,当作业运行到 Map 节点时,因为外部服务的原因导致 JM 所在机器下线,从而造成了 JM failover。

722172835e114757b0bec390e8b9e7e8.png

随后,高可用服务将会自动拉起新的 JM 进程,作业将进入 RECONCILING 状态,表示作业进入了恢复运行进展的阶段。

e79f031d144b43911ce00353c533a8d0.png

当作业恢复完成后,将进入 RUNNING 状态。

5f67c705ba206ec4ef73ab216b76f98c.png

点进作业详情页后,可以观察到作业已经恢复到 JM failover 前到进展了。

c2ba2882722700be139132811073cd66.png

04

如何启用

要使用 Flink 批作业的状态恢复功能,用户需要:

  1. 确保已启用集群高可用:目前 Flink 提供了基于 Zookeeper 和 Kubernetes 的两种高可用服务,更多细节详见官方文档1。

  2. 配置execution.batch.job-recovery.enabled: true

所有 new source 都支持批处理作业在 JM 出错后进行进度恢复。然而,为了实现细粒度的进度恢复,new source的SplitEnumerator 需要实现 SupportsBatchSnapshot 接口,否则只有在该 source 的所有并发任务完成后,才能在 JM 出错恢复后避免重新执行这个 source 的 task。当前,FileSource 和 HiveSource 已经实现了该接口。详细信息请参见官方文档2。

考虑到不同集群和作业的差异,为了让批作业在 job master failover 后能够尽可能的恢复出错前的进度,避免重新运行已完成的任务,用户可以参考此文档进行配置项调优。


  • 官方文档1:https://nightlies.apache.org/flink/flink-docs-master/zh/docs/deployment/ha/overview/

  • 配置参数:https://nightlies.apache.org/flink/flink-docs-master/zh/docs/deployment/config/#execution-batch-job-recovery-enabled

  • new source:https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/connector/source/Source.java

  • SplitEnumerator:https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/connector/source/SplitEnumerator.java

  • SupportsBatchSnapshot:https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/connector/source/SupportsBatchSnapshot.java

  • 官方文档2:https://nightlies.apache.org/flink/flink-docs-release-1.20/zh/docs/ops/batch/recovery_from_job_master_failure/

  • 文档:https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/ops/batch/recovery_from_job_master_failure/

e7a4347c2b330749cca4427814f23bf0.png

活动推荐


阿里云基于 Apache Flink 构建的企业级产品-实时计算 Flink 版现开启活动:

新用户复制下方链接或者扫描二维码即可0元免费试用 Flink + Paimon

了解活动详情:https://free.aliyun.com/?pipCode=sc

e368c7e07d91a3e68a057176a6a4e0d8.jpeg


▼ 关注「Apache Flink」,获取更多技术干货 ▼

4efd984ca4e78a1e773844c2e33cfa29.png

 6903f8c061d29d35cf0947ace0b16562.gif  点击「阅读原文」跳转阿里云实时计算 Flink

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

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

相关文章

数据结构实验:用栈求解迷宫问题的所有路径及最短路径

用栈求解迷宫问题的所有路径及最短路径 题目描述 编写一个程序exp3-5.cpp,改进《教程》3.1.4节中的求解迷宫问题程序,要求输 如图3.9所示的迷宫的所有路径,并求第一条最短路径及其长度。 在本实验中用mg作为迷宫数组,用St数组作为顺序栈,Path数组保存一条迷宫径,将它们都设置为…

47 C 语言实战项目——家庭收支记账软件

目录 1 需求说明 1.1 菜单显示 1.2 登记收入 1.3 登记支出 1.4 显示收支明细 1.5 退出 2 流程分析 2.1 总流程图 2.2 登记收入流程图 2.3 登记支出流程图 2.4 收支明细流程图 2.5 退出流程图 3 代码实现 3.1 框架搭建 3.2 收支明细功能 3.3 登记收入功能 3.4 …

解决UOS操作系统vim内容鼠标选中后进入可视模式,无法复制问题

现象: 在 vim 插入模式中右键单击出现可视模式,如下图 解决方法: 1. 编辑文件 rootkylin-PC:~# vi /usr/share/vim/vim81/defaults.vim 改为

ANSYS Workbench多边形骨料及界面过渡区混凝土细观模型

混凝土细观模型是一种用来研究混凝土材料内部结构和性能的分析方法。它主要关注于混凝土中不同组分(如骨料、水泥浆体等)之间的相互作用以及这些相互作用如何影响整体材料的行为。在建立这样的模型时,考虑到多边形骨料及其与周围基质之间形成…

【含文档】基于Springboot+Android的环境保护生活App(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

Jenkins入门:流水线方式部署多模块Springboot项目

目录 一、环境准备 1. 搭建配置Jenkins (在上一篇基础上进行) 2. 安装mysql 3. 安装redis 4. 配置docker-componse 5. 启动docker-componse 二、脚本准备 1. Jenkinsfile 2. deploy.sh 3. Dockerfile 三、Jenkins流水线配置 新增版本号参数 流水线选择代码里面的Je…

ffmpeg面向对象——rtsp拉流探索(1)

目录 1.tcp创建及链接的流程图及对象图2.解析 标准rtsp协议的基石是tcp,本节探索下ffmpeg的rtsp拉流协议tcp的socket创建及链接。 1.tcp创建及链接的流程图及对象图 tcp创建及链接的流程图,如下: tcp创建及链接的对象图,如下&…

QD1-P15 HTML 文本标签(textarea、label)

本节学习 HTML 常用标签:textarea和label ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p15 ‍ 知识点1:textarea标签的用途 可输入多行文本的控件 cols属性: 文本的可见宽度 rows属性: 文本的可见行数 HTML示例 &l…

Map父接口

通过API可以详细查看Map接口包含的具体方法。重点的方法包括: 案例一:Map接口的基本使用 package com.map;import java.util.HashMap; import java.util.Map; import java.util.Set;/*** Map接口的使用* 特点:存储键值对;键不能重…

【数据结构】零碎知识点(易忘 / 易错)总结回顾

一、数据结构的概念 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 二、算法 算法(Algorithm)就是定义良好的计算过程,它取一个或一组的值为…

Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测|数据分享...

全文链接:https://tecdat.cn/?p37839 分析师:Kefan Yu 在大众旅游蓬勃发展的背景下,乡村旅游已成为推动乡村经济、社会和文化发展的关键力量。当前,乡村旅游接待设施主要以招待所、小宾馆和农家乐等形式存在。然而,一…

二叉树改良版——AVL树

为什么说是“改良”,其实标题的二叉树指的是搜索二叉树,它虽然可以缩短查找的效率,但如果数据已经有序或接近有序的话二叉树就会退化成单支树,这样查找元素的话反而会效率低下。因此,为了解决这个问题,AVL树…

zynq 添加lwip库

在自己的项目属性中. 就是在上一行的下面加了一行配置. 多了个 -llwip4 -Wl,--start-group,-lxil,-llwip4,-lgcc,-lc,--end-group

第十四届单片机嵌入式蓝桥杯

一、CubeMx配置 (1)LED配置 (1)LED灯里面用到了SN74HC573ADWR锁存器,这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚(使能引脚),由PD2这个端口来控制的 (2&#xff…

Qt初识_通过代码创建hello world

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Qt初识_通过代码创建hello world 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1.通过按…

魔珐出席INSIGHT金融洞察力峰会,共探AI内容生成新范式

2024年9月27日,2024INSIGHT金融洞察力在北京举行,来自银行、保险、期货、证券、基金等行业的业界翘楚,共商行业热点议题,为金融行业增进互信、扩大合作搭建闭门平台,贡献价值与力量。 魔珐科技AIGC业务负责人杜子航&a…

XUbuntu安装OpenSSH远程连接服务器

目录 打开终端。更新你的包索引安装OpenSSH服务器。在终端中输入以下命令:安装完成后,OpenSSH服务器会自动启动。查看主机 IP测试连接打开 cmd 终端SSH 连接虚拟机确认连接输入连接密码发现问题修改用户,尝试连接 打开终端。 更新你的包索引 …

候机时间计算(数学小题目,练习时间字符串“解析”)

时间字符串的简单处理,可自行解析也可以调库。 (笔记模板由python脚本于2024年10月10日 18:06:42创建,本篇笔记适合有基本编程逻辑的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“…

MinIO 学习订阅服务

MinIO 的入门非常简单 — 只需几个简单的命令和一个 100 MB 的小二进制文件,您就可以立即启动并运行一个功能性开发环境。但是,为了在生产规模上利用 MinIO 的全部功能,我们鼓励专业人士更多地了解 MinIO 的广泛功能。我们推出了 MinIO 学习订…

Spring Boot课程问答:技术难题专家解答

摘要 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求,创建了一个计算机管理课程答疑系统的方案。文章介…