Flink概念知识讲解之:Restart重启策略配置
Flink概念知识讲解之:Restart重启策略配置
当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。
Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以重启以及重启的间隔;故障恢复策略决定哪些 Task 需要重启。
重启策略
Flink 作业如果没有定义重启策略,则会遵循集群启动时加载的默认重启策略。 如果提交作业时设置了重启策略,该策略将覆盖掉集群的默认策略。
可以通过 Flink 的配置文件 flink-conf.yaml
来设置默认的重启策略。配置参数restart-strategy
定义了采取何种策略。 如果没有启用 checkpoint,就采用“不重启”策略。如果启用了 checkpoint 且没有配置重启策略,那么就采用固定延时重启策略, 此时最大尝试重启次数由 Integer.MAX_VALUE
参数设置。
restart-strategy从1.17版本开始之后改为restart-strategy.type
每个重启策略都有自己的一组配置参数来控制其行为。 这些参数也在配置文件中设置。 后文的描述中会详细介绍每种重启策略的配置项。
restart-strategy的可选值包括以下:
- none, off, disable: 不重启策略。
- fixeddelay, fixed-delay :固定延时重启策略。
- failurerate, failure-rate: 故障率重启策略。
- exponentialdelay, exponential-delay: 指数延迟重启策略。
接下来,我们来分别详细描述一下这些重启策略的原理。
fixed-delay 固定延时重启策略
固定延时重启策略按照给定的次数尝试重启作业。 如果尝试超过了给定的最大次数,作业将最终失败。 在连续的两次重启尝试之间,重启策略等待一段固定长度的时间。
通过在 flink-conf.yaml
中设置如下配置参数,默认启用此策略。
restart-strategy: fixed-delay
配置项:
- estart-strategy.fixed-delay.attempts 默认值 1 ,也就是默认重启1一次。请注意这个和没有配置重启策略的默认值不一样,没有配置策略,默认值为 Integer.MAX_VALUE。
- restart-strategy.fixed-delay.delay 默认值 1 s ,两次连续重新启动尝试之间的延迟时间。如:1 min 、 20 s
举例如下:
restart-strategy: fixed-delay
restart-strategy.fixed-delay.attempts: 3
restart-strategy.fixed-delay.delay: 10 s
在这种配置下,如果任务从 “Restarting” 状态变成了 “Running”,然后再次因为异常变成 “Restarting”,那么重启次数并不会重新计数。 restart-strategy.fixed-delay.attempts
这个参数设置的是在整个任务运行期间最多允许重启的次数,而不是连续失败时的最多重启次数。也就是说,无论任务在运行过程中的任何时间点出现异常,只要累计的重启次数没有超过 5 次,都会尝试进行重启。因此,即使任务在重启后恢复运行,但后续再次失败,重启次数仍会继续累计,而不会重新计数。
failure-rate 故障率重启策略
故障率重启策略在故障发生之后重启作业,但是当故障率(每个时间间隔发生故障的次数)超过设定的限制时,作业会最终失败。 在连续的两次重启尝试之间,重启策略等待一段固定长度的时间。
通过在 flink-conf.yaml
中设置如下配置参数,默认启用此策略。
restart-strategy: failure-rate
配置项:
restart-strategy.failure-rate.max-failures-per-interval
: 这个设置是在给定的时间间隔内允许的最大失败次数。例如,如果设置为 3,则表示在设定的时间间隔内,如果作业失败了超过3次,Flink将不再尝试重启作业。restart-strategy.failure-rate.failure-rate-interval
: 这个设置是用于测量故障率的时间窗口。这个时间间隔与上一个参数一起使用,例如,如果设置为 “1 min”,则 Flink 会在每个 “1 min” 的时间段内跟踪作业失败次数,并与max-failures-per-interval
的设置进行比较。restart-strategy.failure-rate.delay
: 这是连续两次尝试重新启动作业之间的延迟时间。例如,如果作业失败后立即尝试进行重启,然后又失败,此设置将使 Flink 在下一次尝试重新启动之前等待指定的时间。此设置有助于避免作业在出现持续性问题时过于频繁地尝试重启。
举例如下:
restart-strategy: failure-rate
restart-strategy.failure-rate.max-failures-per-interval: 3
restart-strategy.failure-rate.failure-rate-interval: 5 min
restart-strategy.failure-rate.delay: 10 s
exponential-delay 指数延迟重启策略
指数延迟重启策略在两次连续的重新启动尝试之间,重新启动的延迟时间不断呈指数增长,直到达到最大延迟时间。 然后,延迟时间将保持在最大延迟时间。
当作业正确地执行后,指数延迟时间会在一些时间后被重置为初始值,这些阈值可以被配置。
restart-strategy.type: exponential-delay
配置项:
-
restart-strategy.exponential-delay.attempts-before-reset-backoff
- 默认值 infinite ,如果重新启动策略已设置为指数延迟,则表示Flink 在任务失败前重试执行的次数。一旦 backoff 被重置为其初始值,该数字将被重置。
-
restart-strategy.exponential-delay.backoff-multiplier:
-
指数延迟重启策略的基本工作原理是,在每一次 任务失败并需要重启时,系统都会等待一段时间,这段时间就被称为 “backoff”。 系统初始的 “backoff” 时间由
restart-strategy.exponential-delay.initial-backoff
这个配置项来设定。当任务连续失败时,为了防止过于频繁的重启,可能使得问题更加严重,系统会在每次重启之前将 “backoff” 时间进行延长。这个延长就是按照指数递增的:每一次延长的 “backoff” = 当前的 “backoff” *
restart-strategy.exponential-delay.backoff-multiplier
。比如说,如果你的
initial-backoff
是 10s,而backoff-multiplier
是 2,那么:- 第1次重启会等待 10s
- 第2次重启会等待 10s * 2 = 20s
- 第3次重启会等待 20s * 2 = 40s
- 以此类推
通过这种方式,Flink 可以在遇到持续性的问题时,通过逐渐增加重启间隔,为系统提供恢复的时间,同时也避免了过于频繁的重启导致的系统压力。
-
-
restart-strategy.exponential-delay.initial-backoff:
restart-strategy.exponential-delay.initial-backoff
配置项用于设置每次重新启动任务时的初始暂停(backoff)时间。默认值是 1 秒。这个配置项的影响是,在任务失败后,将等待这个初始暂停时间后才进行第一次重启尝试。
-
restart-strategy.exponential-delay.jitter-factor:
-
restart-strategy.exponential-delay.jitter-factor
默认值是0.1,表示实际重启间隔在计算出的间隔基础上会添加或减去最多10%的时间。 假设按照指数间隔计算出的重启间隔是100秒,那么加入抖动因子后,实际的重启间隔将在90秒到110秒之间。例如,假设我们的 backoff 时间是 10s,乘数为 2,抖动因子为 0.1。那么在第一次任务失败后,重启的等待时间将在 9s 到 11s 之间(±10%)。如果任务再次失败,那么下一次的等待时间将在 (2*10s)90% 到 (210s)*110% 之间,即 18s 到 22s。这样就能够在一定程度上避免多个作业同时重启的问题,从而更好地利用资源,提高系统的稳定性和效率。
-
-
restart-strategy.exponential-delay.max-backoff:
restart-strategy.exponential-delay.max-backoff
是 Flink 的指数延时重启策略中的一个配置项,其作用是设置每次尝试重新启动任务之间的最大暂停持续时间。其默认值是 “1 min”,代表最大的等待重启时间是 1 分钟。- 在 exponential-delay 类型的重启策略中,每次任务失败后的重启等待时间会按照一个乘数进行增长,这个乘数是由
restart-strategy.exponential-delay.backoff-multiplier
配置项进行控制的。但无论这个乘数设置为多少,实际的等待时间都不会超过restart-strategy.exponential-delay.max-backoff
所设置的值。
-
restart-strategy.exponential-delay.reset-backoff-threshold:
-
restart-strategy.exponential-delay.reset-backoff-threshold"
是 Flink 指数延迟重启策略中的一个配置项,其默认值为 “1h”。 这个参数的作用是,设定一个时间阈值,当作业能够成功运行超过这个阈值的时间之后,下一次如果出现任务失败,计算重启时间间隔也就是backoff会被重置为初始值。换句话说,这是判断系统是否已经从错误恢复,并将失败尝试次数重置的指标。 -
为什么要这么设计呢?
在指数延迟重启策略中,每次任务失败后的重启等待时间会按照一个乘数进行增长,这个乘数是由
restart-strategy.exponential-delay.backoff-multiplier
配置项进行控制的。然而,这种策略存在一个问题,也就是如果曾有过一段时间的失败,会导致后续的重启间隔变得非常长。因此,
restart-strategy.exponential-delay.reset-backoff-threshold
就派上了用场。如果一个任务在一段时间(例如 “1h”)内没有失败,那么我们可以认为,这个任务已经从之前的错误中恢复过来。那么下一次如果再出现任务失败,我们就可以将backoff重置为初始值,而不需要采取以前因为连续错误而逐渐增加的延迟时间。
-
举例如下:
restart-strategy: exponential-delay
restart-strategy.exponential-delay.initial-backoff: 10 s
restart-strategy.exponential-delay.max-backoff: 2 min
restart-strategy.exponential-delay.backoff-multiplier: 1.4
restart-strategy.exponential-delay.reset-backoff-threshold: 10 min
restart-strategy.exponential-delay.jitter-factor: 0.1
restart-strategy.exponential-delay.attempts-before-reset-backoff: 10
默认重启策略
默认情况下,没有开启 checkpoint ,不重启。开启 checkpoint ,默认采用固定延时重启策略。但是默认 1s 重启一次,且会一直尝试重启,没有上限次数。这种频繁无限的默认重启策略是不合理的,可能会导致外部组件雪崩,也会一直占用计算资源。
所以在 1.19版本,默认策略改为指数延迟重启策略。我们强烈推荐 Flink 用户使用指数延迟重启策略,因为使用这个策略时, 作业偶尔异常可以快速重试,作业频繁异常可以避免外部组件发生雪崩。原因如下所示:
- 所有的重启策略在重启作业时都会延迟一定的时间来避免频繁重试对外部组件的产生较大压力。
- 除了指数延迟重启策略以外的所有重启策略延迟时间都是固定的。
- 如果延迟时间设置的过短,当作业短时间内频繁异常时,会频繁重启访问外部组件的主节点,可能导致外部组件发生雪崩。例如:大量的 Flink 作业都在消费 Kafka,当 Kafka 集群出现故障时大量的 Flink 作业都在同一时间频繁重试,很可能导致雪崩。
- 如果延迟时间设置的过长,当作业偶尔失败时需要等待很久才会重试,从而导致作业可用率降低。
- 指数延迟重启策略每次重试的延迟时间会指数递增,直到达到最大延迟时间。
- 延迟时间的初始值较短,所以当作业偶尔失败时,可以快速重试,提升作业可用率。
- 当作业短时间内频繁失败时,指数延迟重启策略会降低重试的频率,从而避免外部组件雪崩。
- 除此以外,指数延迟重启策略的延迟时间支持抖动因子 (jitter-factor) 的配置项。
- 抖动因子会为每次的延迟时间加减一个随机值。
- 即使多个作业使用指数延迟重启策略且所有的配置参数完全相同,抖动因子也会让这些作业分散在不同的时间重启。
相关文章:
Flink概念知识讲解之:Restart重启策略配置
Flink概念知识讲解之:Restart重启策略配置 当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以…...

[java基础-集合篇]LinkedList源码粗析
LinkedList 的数据结构 实现List、Deque 接口,基于 双向链表实现的列表。与基于数组的 ArrayList 不同,基于链表的LinkedList 允许在列表的任何位置快速地插入和删除元素。 Java中LinkedList实现了Deque,它提供了 add, offer, remove, poll, …...
面试:C++类成员初始化顺序
1、非静态数据成员:按它们在类定义的声明顺序初始化,不会按它们在初始化列表的顺序。 2、静态数据成员:在main函数启动之前,并且只初始化一次 3、基类构造函数:如果类从一个或多个基类继承而来,基类的构造…...

【Python】Python与C的区别
文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如,int a 10;、printf("Hello, World!");。分号是语句的一部分,用于…...

[开源]自动化定位建图系统(视频)
系统状态机: 效果展示: 1、 机器人建图定位系统-基础重定位,定位功能演示 2、 机器人建图定位系统-增量地图构建,手动回环检测演示 3、… 开源链接: https://gitee.com/li-wenhao-lwh/lifelong-backend Qt人机交互…...

ISP流程--去马赛克详解
前言 本期我们将深入讨论ISP流程中的去马赛克处理。我们熟知,彩色图像由一个个像元组成,每个像元又由红、绿、蓝(RGB)三通道构成。而相机传感器只能感知光的强度,无法直接感知光谱信息,即只有亮暗而没有颜色…...
Objective-C语言的软件工程
Objective-C语言的软件工程探讨 引言 在软件工程的领域中,编程语言的选择是至关重要的。Objective-C,作为一种为苹果公司的macOS和iOS操作系统而开发的编程语言,凭借其灵活性和强大的功能被广泛应用于应用开发。然而,随着Swift等…...
Objective-C语言的语法糖
Objective-C语言的语法糖探秘 在编程语言的发展历程中,语法糖(Syntactic Sugar)是一个颇具趣味性和重要性的概念。它让编程的表达更加简洁直观,同时提高了代码的可读性和可维护性。Objective-C 作为一种面向对象的编程语言&#…...
设计模式中的代理模式
在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。 一、静态代理模式 在编译时就已经确定了代理类和被代理类的关系。 代理类和目标对象通常实现相同的接口或继承相同父类。 缺点是对于每个需要代理的目标对象…...
15个学习Python 的编程游戏网站
从小很多人都会在想,那些枯燥的教学课程要是全部变成游戏就好了,这样的话那期末成绩不得立即起飞了嘛?那对于编程很多人也有这样的想法,边玩边学就好了 这不已经有很多程序员开发了多款边玩边学的编程游戏供大家使用,…...
微信小程序实现拖拽盒子效果
要实现一个当前盒子高度由里面的盒子进行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 内容 --><view class"exm…...
Linux-蓝牙协议
SPP (Serial Port Profile): 串口协议(SPP)是一个蓝牙配置文件,允许设备通过蓝牙模拟传统的串行端口通信。它通常用于无线串口连接,允许设备如计算机和外设(例如打印机或条形码扫描器)之间进行数据传输。A…...

moviepy 将mp4视频文件提取音频mp3 - python 实现
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…...
imageio 图片转mp4 保存mp4
目录 安装: imageio 图片转mp4 numpy 保存mp4 安装: FFMPEG: pip install imageio[ffmpeg] pyav: pip install imageio[pyav] imageio 图片转mp4 import glob import osimport cv2 import imageio from natsort import natsortedfrom PIL import …...

Postman接口测试04|批量运行测试用例、参数化、Mock Server、Cookie鉴权、Newman生成测试报告
目录 十一、Postman批量运行测试用例 十二、实现数据驱动(也称参数化) 1、csv文件 1️⃣编辑csv文件 2️⃣更新参数的值 3️⃣修改测试脚本和断言 5️⃣批量运行测试用例 2、Json文件 1️⃣编辑Json文件 2️⃣其他操作和处理csv文件相同 十三、…...
学技术学英语:http状态码 401 Unauthorized vs 403 Forbidden
📢📢📢:先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 unauthorized未授权的/ˌʌnˈɔːθəraɪzd/authentication认证/…...

@LocalBuilder装饰器: 维持组件父子关系
一、前言 当开发者使用Builder做引用数据传递时,会考虑组件的父子关系,使用了bind(this)之后,组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题,引入LocalBuilder装饰器。…...

React(二)——Admin主页/Orders页面/Category页面
文章目录 项目地址一、侧边栏1.1 具体实现 二、Header2.1 实现 三、Orders页面3.1 分页和搜索3.2 点击箭头显示商家所有订单3.3 页码按钮以及分页 四、Category页面4.1 左侧商品添加栏目4.2 右侧商品上传栏 五、Sellers页面六、Payment Request 页面(百万数据加载&a…...

移动端屏幕分辨率rem,less
谷歌模拟器:能直接看到移动端效果 屏幕分辨率 右键电脑桌面 ,点击显示设置 PC端是逻辑分辨率,移动端代码也是参考逻辑分辨率 网页端宽度和逻辑分辨率尺寸相同 手机屏幕尺寸不同,网页宽度均为 100% 所以就需要添加视口标签&#x…...

Docker Desktop 构建java8基础镜像jdk安装配置失效解决
Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像,前几天我使用Docker Desktop环境重新构建了一个…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...