3、Flink执行模式(流/批)详解(上)

0、批模式和流模式对比表
类别流模式批模式
任务调度所有任务需要持续运行,消耗资源大任务可以按Shuffle分阶段执行,消耗资源小
Shuffle记录会被流水线式的持续发送到下游任务,在网络上进行缓冲可以保存Shuffle分阶段执行的中间结果
State Backends & State使用StateBackend控制状态的存储方式和检查点的工作方式对输入按key分组排序,依次处理一个key的所有记录,在同一时间只保留一个key的状态,当处理到下一个key时,上一个key的状态将被丢弃
处理顺序对于用户自定义函数,数据一到达就被处理广播输入》常规输入》keyed 输入
事件时间存在数据乱序的可能不存在数据乱序的可能,可以按时间排序
水位线使用Watermark(一个带有时间戳 T 的水印)标志再没有时间戳 t < T 的元素出现在当前key的末尾有一个 MAX_WATERMARK,仅在每个key末尾触发定时器,在下一个key的开始有一个MIN_WATERMARK
处理时间事件时间和处理时间存在相关性事件时间和处理时间相关性不存在,允许用户请求当前的处理时间,并注册处理时间计时器,仅在每个key末尾触发计时器
故障恢复使用 checkpoint 进行故障恢复,发生故障时,从 checkpoint 重新启动所有正在运行的任务尝试回溯到之前的中间结果仍可获取的处理阶段,只有失败的任务才需要重新启动
1)概述
1.流处理和批处理概述

DataStream API 的流(STREAMING)执行模式,适用于需要连续增量处理,而且常驻线上的无边界作业。

DataStream API 的批(BATCH)执行模式,类似于 MapReduce 等批处理框架,适用于已知输入、不会连续运行的的有边界作业。

Flink 对流处理和批处理采取统一的处理方式,无论配置何种执行模式,在有界输入上执行的 DataStream 应用都会产生相同的最终 结果;在模式执行的作业可能会产生增量更新(类似于数据库中的插入(upsert)操作),而作业只在最后产生一个最终结果。

通过启用执行模式,Flink 可以对有边界作业进行额外的优化:可以使用不同的关联(join)/ 聚合(aggregation)策略、不同 shuffle 实现来提高任务调度和故障恢复的效率等。

2.批执行模式选择时机

执行模式只能用于 有边界 的作业/Flink 程序。

边界:是数据源的一个属性,表明是否在执行之前已经知道来自该数据源的所有输入,或者新数据是否会无限期地出现;如果作业的所有源都是有边界的,则它就是有边界的,否则就是无边界的。

执行模式,既可用于有边界任务,也可用于无边界任务。

执行模式,只用于有边界任务。

使用模式运行有边界作业

  • 使用有边界作业的运行结果去初始化作业状态,并将该状态在之后的无边界作业中使用;例如,通过模式运行一个有边界作业,获取一个 savepoint,然后在一个无边界作业上恢复这个 savepoint【将 savepoint 作为 执行作业的附加输出】;
  • 为无边界数据源写测试代码时,使用有边界数据源更自然。
3.配置批执行模式

执行模式可以通过 execution.runtime-mode 配置,可选值如下:

  • STREAMING: 经典 DataStream 执行模式(默认)
  • BATCH: 在 DataStream API 上进行批量式执行
  • AUTOMATIC: 让系统根据数据源的边界性来决定

可以通过 bin/flink run ... 的命令行参数配置,或者在创建/配置 StreamExecutionEnvironment 时写进程序。

案例:通过命令行配置执行模式

bin/flink run -Dexecution.runtime-mode=BATCH <jarFile>

案例:在代码中配置执行模式

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRuntimeMode(RuntimeExecutionMode.BATCH);

注意不建议在程序中设置运行模式,而是在提交应用程序时使用命令行设置,保持应用程序代码的免配置可以让程序更加灵活,因为同一个应用程序可能在任何执行模式下执行。

4.执行行为
a)任务调度与网络 Shuffle

执行模式中,因为输入数据是有边界的,Flink可以使用更高效的数据结构和算法来进行任务调度和网络 shuffle。

案例:任务调度和网络传输的差异

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

DataStreamSource<String> source = env.fromElements(...);

source.name("source")
	.map(...).name("map1")
	.map(...).name("map2")
	.rebalance()
	.map(...).name("map3")
	.map(...).name("map4")
	.keyBy((value) -> value)
	.map(...).name("map5")
	.map(...).name("map6")
	.sinkTo(...).name("sink");

map()flatMap()filter(),可以依靠算子链链在一起,直接将数据转发到下一个操作,不涉及网络 shuffle。

keyBy()rebalance() ,需要在不同的任务并行实例之间传输数据,涉及网络 shuffle。

对于上面的例子,Flink 会将操作分组为以下任务

  • 任务1: sourcemap1map2
  • 任务2: map3map4
  • 任务3: map5map6sink

在任务1到任务2、任务2到任务3之间各有一次网络 shuffle,作业的可视化表示如下

在这里插入图片描述

i)流执行模式

在**执行模式下**,所有任务需要持续运行;Flink可以通过整个管道立即处理新的记录,以达到需要的连续和低延迟的流处理;同时分配给某个作业的 TaskManagers 需要有足够的资源来同时运行所有的任务。

网络 shuffle 是 流水线 式的,记录会立即发送给下游任务,在网络层上进行一些缓冲;当处理连续的数据流时,在任务(或任务管道)之间没有可以实体化的自然数据点(时间点),而在执行模式下,中间的结果可以被实体化。

ii)批执行模式

在**执行模式下**,作业的任务可以分阶段执行;因为输入是有边界的,因此 Flink 可以在进入下一个阶段之前完全处理管道中的一个阶段;在上面的例子中,工作会有三个阶段,对应着被 shuffle 界线分开的三个任务。

分阶段处理要求 Flink 将任务的中间结果实体化到非永久存储中,让下游任务在上游任务下线后再读取,将增加处理的延迟,但这允许 Flink 在故障发生时回溯到最新的可用结果,而不是重新启动整个任务;同时作业可以在更少的资源上执行

TaskManagers 将至少在下游任务开始消费前保留中间结果,在这之后,只要空间允许,中间结果就会被保留,以便任务失败回滚。

b)State Backends / State

模式下,Flink 使用 StateBackend 控制状态的存储方式和检查点的工作方式。

模式下,配置的 state backend 被忽略;对输入按 key 分组(使用排序),依次处理一个 key 的所有记录,以便在同一时间只保留一个 key 的状态,当进行到下一个 key 时,上一个 key 的状态将被丢弃。

c)处理顺序

执行和执行中,算子或用户自定义函数(UDF)处理记录的顺序可能不同。

模式下,对于用户自定义函数,数据一到达就被处理。

模式下,Flink 确保数据有序,排序可以是特定调度任务、网络 shuffle、上文提到的 state backend 等。

将常见输入类型分为三类

  • 广播输入(broadcast input): 从广播流输入【广播状态】;
  • 常规输入(regular input): 从广播或 keyed 输入;
  • keyed 输入(keyed input): 从 KeyedStream 输入;

消费多种类型输入的函数或算子,处理顺序如下

  • 广播输入第一个处理
  • 常规输入第二个处理
  • keyed 输入最后处理

对于从多个常规或广播输入进行消费的函数 — 比如 CoProcessFunction — Flink 有权从任一输入以任意顺序处理数据。

对于从多个keyed输入进行消费的函数 — 比如 KeyedCoProcessFunction — Flink 先处理单一键中的所有记录再处理下一个。

d)事件时间/水印

模式下,存在数据乱序的可能,使用 Watermark(一个带有时间戳 T 的水印)标志再没有时间戳 t < T 的元素跟进。

模式下,输入的数据集是事先已知的,至少可以按照时间戳对元素进行排序,从而按照时间顺序进行处理,不存在数据乱序的可能。

综上:在模式下,只需要在输入的末尾有一个与每个键相关的 MAX_WATERMARK,如果输入流没有键,则在输入的末尾需要一个 MAX_WATERMARK;所有注册的定时器都会在 时间结束 时触发,用户定义的 WatermarkAssignersWatermarkStrategies 会被忽略;但配置 WatermarkStrategy 是有用的,因为它的 TimestampAssigner 仍然会被用来给记录分配时间戳。

e)处理时间

处理时间是指在处理记录的具体实例上,处理记录的机器上的时钟时间,基于处理时间的计算结果是不可重复的,因为同一条记录被处理两次,会有两个不同的时间戳。

模式下,事件时间和处理时间存在相关性;在模式下事件时间的1小时也几乎是处理时间的1小时,使用处理时间可以用于早期(不完全)触发,给出预期结果的提示。

模式下,事件时间和处理时间相关性不存在,因为输入的数据集是静态的;允许用户请求当前的处理时间,并注册处理时间计时器,但与事件时间的情况一样,所有的计时器都要在输入结束时触发。

在作业执行过程中,处理时间不会提前,当整个输入处理完毕后,会快进到时间结束。

f)故障恢复

模式下,Flink 使用 checkpoint 进行故障恢复,在发生故障时,Flink 会从 checkpoint 重新启动所有正在运行的任务。

模式下,Flink 会尝试回溯到之前的中间结果仍可获取的处理阶段,只有失败的任务才需要重新启动,相比从 checkpoint 重新启动所有任务,可以提高作业的处理效率和整体处理时间。

5.重要的考虑因素
a)概述

模式下的行为变化

  • “滚动"操作,如 reduce() 或 sum(),会对模式下每一条新记录发出增量更新,在模式下,只发出最终结果。

模式下不支持

  • Checkpointing 和任何依赖于 checkpointing 的操作都不支持。
b)Checkpointing

批处理程序的故障恢复不使用检查点,因为没有 checkpoints,某些功能如 CheckpointListener ,以及因此,Kafka 的精确一次(EXACTLY_ONCE) 模式或 File Sink 的 OnCheckpointRollingPolicy 将无法工作。

仍然可以使用所有的状态原语(state primitives),只是用于故障恢复的机制会有所不同。

c)编写自定义算子

注意模式下运行良好的 Operator 可能会在模式下产生错误的结果。

  • 模式下,会逐个 key 处理记录;因此,Watermark 会在每个 key 之间从 MAX_VALUE 切换到 MIN_VALUE
  • Watermark 在一个算子中不总是递增的。
  • 定时器将首先按 key 的顺序触发,然后按每个 key 内的时间戳顺序触发。
  • 不支持手动更改 key 的操作。
6.总结
1、即使不配置执行模式,在有界输入上执行的DataStream应用会产生相同的最终结果,但是配置批处理模式执行有界作业后,可以执行额外的优化。

2、可以通过代码【不建议】和命令行【建议】配置运行模式。

3、相同的算子在批模式下和流模式下可能会产生不同的结果(水位线的触发=>定时器的触发、窗口的触发)。

4、批执行模式和流执行模式均可以配置重试策略(RestartStrategies)来重启任务,但只有流执行模式支持检查点(Checkpoint)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux的UDEV机制

udev 机制引入&#xff1a; 手机接入Linux热拔插相关 a. 把手机接入开发板 b. 安装adb工具&#xff0c;在终端输入adb安装指令&#xff1a; sudo apt-get install adb c. dmeg能查看到手机接入的信息&#xff0c;但是输入adb devices会出现提醒 dinsufficient permissions for …

Instagram运营5大技巧,防封攻略

对于企业和个人而言&#xff0c;运营Instagram已成为吸引流量、增加曝光、提升品牌知名度的重要手段。然而&#xff0c;许多人在初次尝试Ins运营时可能会遇到困难&#xff0c;不知道从何入手。本文将为您分享五大技巧&#xff0c;帮助您更好地运营Instagram&#xff0c;吸引更多…

【文章转载】Lance Martin的关于RAG的笔记

转载自微博黄建同学 从头开始学习 RAG&#xff0c;看Lance Martin的这篇笔记就行了&#xff0c;包含了十几篇论文和开源实现&#xff01; —— 这是一组简短的&#xff08;5-10 分钟视频&#xff09;和笔记&#xff0c;解释了我最喜欢的十几篇 RAG 论文。我自己尝试实现每个想…

迪拜之行回顾:CESS 的 DePIN 创新之旅

迪拜最近是一个关键热词&#xff0c;成为了一系列 Web3 和加密活动的中心&#xff0c;吸引了行业领导者、创新者和爱好者&#xff0c;探索区块链和去中心化技术的最新发展。从 4 月中旬&#xff0c;一系列行业会议和活动陆续举行&#xff0c;吸引了一众与会者。然而暴雨积水又成…

vue集成百度地图vue-baidu-map

文章目录 vue集成百度地图vue-baidu-map1. Vue Baidu Map文档地址2. 设置npm数据源3. 安装vue-baidu-map4. 配置vue-baidu-map4.1 main.js全局注册4.2 vue页面设置4.3 效果 vue集成百度地图vue-baidu-map 1. Vue Baidu Map文档地址 https://dafrok.github.io/vue-baidu-map/#…

从0到1—POC编写基础篇(四)

接着上一篇 cprint 模块 Python内置的 print 函数可以输出任何类型的数据&#xff0c;但有时候输出的内容不够简洁、美观&#xff0c;难以直观地了解程序运行状态。cprint 库就是为了解决这个问题而生的&#xff0c;它可以让Python输出更简洁、更美观。 cprint 库是一个基于装…

ubuntu20.04开机运行java的sh脚本

用到了 rc.local 1、修改 /usr/lib/systemd/system/rc-local.service 在最下面添加 [Install] WantedBymulti-user.target 2、 系统没有 rc.local&#xff0c;需要手动创建 cd /etc vi rc.local在里面写入 /opt/start.sh chmod x /etc/rc.local # 添加可执行权限 chmod x…

基于51单片机空气质量监测报警仿真LCD1602液晶显示( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机空气质量监测报警仿真LCD显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计&#xff1a;4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接 基于51单片机空气质量监测报警仿真LCD显示( proteus仿真程序设计报告原理图讲解视频…

前端CSS基础10(浮动)

前端CSS基础10&#xff08;浮动&#xff09; 浮动元素浮动后的特点浮动后的特点浮动后的影响及解决 浮动布局小练习 浮动 CSS中的浮动是一种布局技术&#xff0c;常用于实现元素的排列和定位。通过使用float属性&#xff0c;可以让元素在页面中左浮动或右浮动&#xff0c;使得…

ubuntu18.04系统编译openwrt21.02.3

搭建ubuntu18.04环境 使用虚拟机安装ubuntu环境网上教程很多&#xff0c;这里不做赘述&#xff0c;主要是安装一些我们在编译openwrt时可能会用到的一些工具环境 sudo apt-get update sudo apt instll libncurses-dev gawk sudo apt-get install build-essential libncurses5…

pytest数据驱动DDT(数据库/execl/yaml)

常见的DDT技术 数据结构&#xff1a; 列表、字典、json串 文件&#xff1a; txt、csv、excel 数据库&#xff1a; 数据库链接 数据库提取 参数化&#xff1a; pytest.mark.parametrize() pytest.fixture() …

2023年图灵奖揭晓,Avi Wigderson成为双冠王

文章目录 Avi Wigderson双冠王个人简介约翰纳什致敬 Avi Wigderson 2024年4月10日&#xff0c;ACM宣布Avi Wigderson为2023年ACM A.M.图灵奖获得者&#xff0c;以表彰他对计算理论的基础性贡献&#xff0c;包括帮助我们重新理解随机性在计算中的作用&#xff0c;以及他在理论计…

第一届长城杯半决赛wp和AWD笔记

目录 AWD 渗透 cfs 单节点1 AWD笔记 AWD工具 文件比较工具 Web漏洞扫描工具 waf工具 代码审计工具 批量网站备份文件泄露扫描工具 cms通杀漏洞的利用 通杀脚本和批量提交flag脚本 防御流程 攻击流程 注意 AWD 解题思路] 首先就是fscan快速扫描对应C段&#xf…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | LCD Number的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | LCD Number的使用及说明 文章编号&#xf…

贪吃蛇的C语言实现

目录 一、游戏流程设计 二、游戏实现原理 2.1如何创建并管理数据 2.2如何实现蛇身移动 2.3如何实现食物随机放置 2.4如何检测按键与调整光标位置 三、源代码 3.1 test.c 3.2 snake.h 3.3 snake.c 一、游戏流程设计 GameStart WelcomeToGame&#xff1a;打印欢迎界面…

架构师系列-消息中间件(九)- RocketMQ 进阶(三)-消费端消息保障

5.2 消费端保障 5.2.1 注意幂等性 应用程序在使用RocketMQ进行消息消费时必须支持幂等消费&#xff0c;即同一个消息被消费多次和消费一次的结果一样&#xff0c;这一点在使用RoketMQ或者分析RocketMQ源代码之前再怎么强调也不为过。 “至少一次送达”的消息交付策略&#xff…

开启医疗数据新纪元:山海鲸可视化智慧医疗解决方案

在数字化浪潮席卷而来的今天&#xff0c;智慧医疗作为医疗行业的创新力量&#xff0c;正以其独特的技术优势&#xff0c;推动着医疗服务的升级和变革。而在这场变革中&#xff0c;山海鲸可视化以其出色的数据可视化能力&#xff0c;为智慧医疗提供了强大的技术支持&#xff0c;…

用Python和Pygame实现简单贪吃蛇游戏

1.pip安装pygame pygam插件安装 pip install 插件名字 # 安装 pip uninstall 插件名字 # 卸载 pip install 插件名字 -i 指定下载的镜像网址 pip show 插件名字 # 查看插件名字 pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple pip show p…

【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

文章目录 网络编程一、什么是网络编程1.TCP和UDP的区别 二、UDP数据报套接字编程DatagramSocketDatagramPacket回显服务器&#xff08;echo server&#xff09; 网络编程 一、什么是网络编程 通过网络&#xff0c;让两个主机之间能够进行通信。基于通信来完成一定的功能。 ​…

MacOS 下gif 文件的几种压缩方法

categories: Tips tags: Tips GIF 写在前面 最近想转换几个 tg 的 tgs 文件到 gif, 然后上传到微信, 所以又涉及到了 gif 的操作了. 工具介绍 安装 brew install imagemagick gifsicleimagemagick 是专业的图像处理工具, gifsicle 是专门处理 gif 的小工具 ,都是开源的. …