Flink 系列四 Flink 运行时架构

目录

前言

介绍

1、程序结构

1.1、Source

1.2、Transformation

1.3、Sink

1.4、数据流

2、Flink运行时组件

2.1、Dispatcher

2.2、JobManager

2.3、TaskManager

2.4、ResourceManager

3、任务提交流程

3.1、standalone 模式

3.2、yarn 模式

4、任务调度原理

4.1、并行度

4.1.1、概念

4.4.2、Flink中的并行度设置

4.2、TaskManager 与 Slots

4.2.1、概念

4.2.2、Slot

4.2.3、Slot与TaskManager关系

4.2.4、并行度和Slot的关系

 4.3、执行图

4.3.1、Flink执行图

4.3.2、数据传输形式

4.3.3、任务链


前言

Flink 是一个用于流处理和批处理的开源分布式计算框架。它的运行时架构包括以下几个关键组件:

  1. JobManager:JobManager 是 Flink 的控制节点,负责接收、解析并编排用户提交的作业。它负责作业的调度、容错和资源管理等任务。

  2. TaskManager:TaskManager 是 Flink 的工作节点,负责执行作业中的任务。每个 TaskManager 可以运行一个或多个任务,一个任务由一个或多个线程组成。TaskManager 与 JobManager 之间通过消息传递进行通信。

  3. JobGraph:JobGraph 是用户提交的作业被解析后的内部表示,它描述了作业的拓扑结构、任务之间的依赖关系和转换操作。

  4. TaskSlots:TaskSlots 是 TaskManager 的执行资源,用于并行执行作业的任务。每个 TaskManager 拥有一定数量的 TaskSlots,可以在不同的作业任务之间共享。

  5. DataStream 和 DataSet:Flink 支持两种不同的计算模型,即 DataStream 和 DataSet。DataStream 是无边界的连续数据流模型,适用于实时流处理;DataSet 是有边界的离散数据集模型,适用于批处理。

  6. State Backend:State Backend管理Flink应用程序的状态(如键值对状态、操作符状态等),并将其持久化到可插拔的后端存储(如内存、文件系统、RocksDB 等)中,以实现容错和恢复功能。

这些组件相互配合,构成了 Flink 运行时架构,能够支持高效且容错的流处理和批处理应用程序的执行。

介绍

1、程序结构

在学习Flink的运行时架构之前先看下Flink的程序结构。Flink程序的基本构建块是流和转换,流是数据记录流(理论上流是无限的),转换是将一个或多个流作为输入并输出一个或多个流。所有的转换称为算子,流就是连接这些算子的桥梁。总的来说Source负责读取数据,Transformation利用各种算子对数据进行加工,Sink负责输出。

1.1、Source

在FlinK中,只有输出流的算子被定义为数据源,Flink在流或者批处理上大概有4类source。

1、基于本地集合的 source

2、基于文件的 source

3、基于网络套接字的 source

4、自定义的 source(自定义的 source 常见的有 Apache kafka、RabbitMQ 、mysql、redis、es 等等)

1.2、Transformation

在Flink中,接收数据流进行处理之后产生输出流的算子被定义为转换,通过数据转换的各种操作,可以将数据转换计算成你想要的数据。Flink定义了丰富的API可以进行各种复杂的转换,转换算子包含:Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select等等

1.3、Sink

数据流经过了各种转换计算之后,通过接收器将结果数据发送到相应的存储介质或者其他的响应的算子叫做Sink。在Flink中的Sink可以有以下定义。

1、写入文件

2、打印出来

3、写入 socket

4、自定义的 sink(自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等等)

1.4、数据流

1、在程序运行时Flink上运行的程序会被映射成逻辑数据流(DataFlow),就是上面咱们了解到的三大块,DataFlow就是一个有向无环图(DAG)。

2、大部分情况下,程序中的转换运算(transformations)和DataFlow的算子都是一一对应的。

2、Flink运行时组件

Flink的运行时架构主要包含4个组件,分别是:作业管理器(JobManager)、任务管理器(TaskManager)、资源管理器(ResourceManager)以及分发器(Dispatcher),因为Flink使用Java和Scale实现的,所以所有的组建都会运行在Java虚拟机上。

2.1、Dispatcher

分发器为任务的提交提供了一个Rest接口,Dispatcher会启动一个WebUI用来方便的提交作业、展示和监控作业执行的信息。Dispatcher在架构中不是必须的,取决于作业的提交运行方式(例如Yarn架构中就不需要该组件)。

2.2、JobManager

作业管理器,控制一个应用程序执行的主进程,即每个应用程序都会被一个不同的JobManager 所控制执行。JobManager在Flink应用程序执行中有一下几个步骤:

1、首先接收到要执行的应用程序,该应用程序包括(作业图(JobGraph)、逻辑数据流图(logical dataflow graph),和打包了所有的类、库以及其他资源的jar包)。

2、将作业图(JobGraph)转换成物理执行图(ExecutionGraph),物理执行图包含了所有并发执行的任务。

3、JobManager会根据物理执行图的任务并行度向资源管理器申请资源(ResourceManager)插槽(slot)。

4、申请到资源之后就根据执行图将任务分发到真正执行的任务管理器(TaskManager)执行。

5、在应用运行的过程中,JobManager会负责各种协调工作,比如全局检查点的协调(CheckPoint)。

2.3、TaskManager

任务管理器是Flink中的工作进程,通常Flink中会有多个TaskManager并行运行,每个TaskManager中包含了多个插槽(slot),插槽的数量,就是应用的任务并行度。

1、应用启动之后TaskManager会向资源管理器注册他所拥有的插槽。

2、JobManager提交了任务之后,ResourceManager会分配1个或多个插槽给JobManager执行调用,真正执行任务。

3、在执行过程中TaskManager可以跟其他的同一应用的TaskManager交换数据。

2.4、ResourceManager

资源管理器,主要负责任务管理器的插槽的管理。TaskManager的插槽是Flink中定义的处理资源的单元。Flink为同的环境和资源管理工具提供了不同的资源管理器,比如在Standalone模式中,当JobManager申请资源时,若没有足够的slot就会等待超时并取消掉其他的任务。但是在yarn、k8s等部署模式中,当ResourceManager没有足够的资源时,他还可以向资源提供平台发起会话申请足够的资源,以启动TaskManager的容器。并且他还负责将空闲的TaskManager进行回收释放计算资源。

3、任务提交流程

了解了Flink运行中的一些重要组件,我们看一下Flink在运行中作业提交的交互流程。下面的这幅图是一个整体的作业提交分发、申请资源以及调度执行的任务提交流程。在不同的部署模式下任务的提交流程稍有不同。

3.1、standalone 模式

通常在我们进行测试或者本地开发的时候会部署使用该模式进行调试,下面是standalone的任务提交流程。

独立集群至少需要两个进程,一个主进程负责管理Dispatcher和ResourceManager,另一个进程主要负责管理TaskManager。主进程会为Dispatcher和ResourceManager创建独立的线程来运行,TaskManager也是需要注册到ResourceManager,在JobManager申请资源的时候被ResourceManager分配。

3.2、yarn 模式

Yarn 是 Apache hadoop的资源管理组件,他负责管理集群下的资计算资源(主要是集群的CPU和内存)。Flink 在Yarn模式上部署的话有两种方式:作业模式(Job Mode)和会话模式(session Mode)。yarn的两种部署方式区别就是作业模式下一个Job提交就会启动一个集群,这个集群就单独运行一个作业,一旦作业结束集群就会停止,全部资源就会释放。而会话模式就是创建一个长时间运行的集群,等着作业提交分配资源执行,该模式下可以运行多个作业。

 1、Flink的Client提交Jar包和配置文件上传到HDFS,以便JobManager和TaskManager共享这些数据。

2、Client提交作业到Yarn的ResourceManager,Yarn的ResourceManager接收到Flink作业之后启动分配congainer资源然后通知NodeManager启动一个ApplicationMaster。

3、ApplicationMaster会先加载1上传到HDFS上的资源启动Flink的JobManager和ResourceManager。

4、JobManager会分析作业中的流图进而转化为可执行图(包含了可并行的任务),并计算出需要的slot。

5、JobManager会先从Flink的ResourceManager申请资源,此时还没有资源可用,Flink的ResourceManager就会向上从Yarn集群的资源管理器申请资源。

6、Yarn资源管理器会根据需要的资源分配Container并通知NodeManager会加载HDFS上1时候的资源并启动Flink的TaskManager并向Yarn的资源管理器和Flink的资源管理器注册资源。并且向JobManager发送心跳包。

7、JobManager获得了足够的资源之后就将分解之后的任务发送至TaskManager 执行。

8、在次过程中JobManager协调全局的工作,比如进行检查点的保存等等。

4、任务调度原理

Flink的任务调度原理就是从我们写的代码开始打包提交到Flink集群转换到真正执行的过程。

 1、首先我们写的代码进行编译打包就是按照代码定义从程序流图转换为数据流图(StreamGraph / DataFlow Graph)。

2、Client(可以是命令行或者WebUI)提交的时候将数据流图进行合并(DataFlow Graph -> JobFraph)并提交给JobManager。

3、JobManager接收到JobFraph之后经过分析在将JobFraph进行并行拆分生成执行图(JobGraph -> executionGraph)

4、JobManager根据最后的物理执行图去ResourceManager申请对应的资源,并且将作业分配给Taskmanager执行。

5、TaskManager实时的将统计信息、心跳信息等信息同步给JobManager。

上图中我们可以看到JobManager申请到两个TaskManager的资源执行任务,并且每个TaskManager有3个插槽,我们能看出来整个集群的并行度是6,但是我们作业的并行度是4。

这里看到上图肯定几个问题需要确认

1、Flink中是怎么实现并行的?

2、并行的任务需要占用多少个Slot?

3、一个流程序包含了多少个任务?

4.1、并行度

对于上面遗留的问题:1、Flink中是怎么实现并行的?,首先要了解的就是Flink中定义的并行度的概念。

4.1.1、概念

一个特定的算子的自任务的个数就是该算子的并行度(parallelism)。一般情况下一个流的并行度就是该流中所有算子中含有最大并行度的算子的并行度。

 

上图中是JobManager按照设置的并行度划分的数据流图,其中Sink的并行度设置为1,其他的算子的并行度设置为2。 按照定义我们可以知道整个流的并行度应该是2,并且只要有至少一个或者多个TaskManager可以提供至少2个Slot就可以部署执行该任务。

4.4.2、Flink中的并行度设置

上图中的并行度怎么设置的呢,在Flink中可以有三种方式设置并行度:

1、全局设置

env.setParallelism(1);

2、算子纬度设置

flatMap(new GpsConstructionTimeFlatMapFunction()).setParallelism(2)

3、默认配置

# 程序默认并行计算的个数 parallelism.default: 1

三种设置方式的优先级:算子纬度 > 全局纬度 > 默认配置

4.2、TaskManager 与 Slots

对于上面遗留的问题2:并行的任务需要占用多少个Slot?需要先了解下Slot资源。

4.2.1、概念

1、Flink每个TaskManager都是一个独立的JVM进程,可以执行一个线程或多个线程。

2、为了控制一个TaskManager可以接收多个任务,TaskManager通过taskSlot资源来进行控制。每个slot可以认为是一块独立的内存。

4.2.2、Slot

默认情况下Flink中的Slot是可以共享的,即使他们是不同任务的子任务,这样做的好处就是既可以节省资源又可以保证一个slot可以保存作业的整个管道,减少网络交互。

4.2.3、Slot与TaskManager关系

slot是一个静态的概念,指的是TaskManager具有的并发能力。

上图就是一个数据并行和任务并行并共享slot的一个执行图。

1、首先作业执行图分为5个任务

1.1、A和C分别是并行度为4和2的Source。

1.2、B是并行度为4的转换算子。

1.3、D是一个并行度为4的转换算子。

1.4、E是并行度为2的Sink算子。

2、我们可以看到右图就是转换之后的实际的物理执行图,有两个并行能力为2的TaskManager就说明咱们的集群的并行度可以支撑为4的并行度的作业。

2.1、Source A分布在4个Slot中,Source C分布在Slot1.1和2.1中,转换算子B、D分布在4个Slot中,Sink算子分布在1.2、2.2的Slot中。

2.2、例如Slot的1.1中的算子B、C共享了一个Slot。他们都是属于不同的任务,这叫任务并行。

2.3、A算在分布在4分Slot中这叫做数据并行。

2.4、其中1.2和2.2的Slot保留有整合数据管道,即使其他的算子出了问题,这个算子内的数据也可以得到准确的输出。并且这两个Slot中的算子进行数据交换的时候不会进过网络提高了效率。

4.2.4、并行度和Slot的关系

 4.3、执行图

4.3.1、Flink执行图

咱们在上面还遗留有一个问题:3、一个流程序包含了多少个任务?咱们要想知道有多少个任务就要知道Flink是怎么执行的。

Flink的执行图可以分为下面四个层级

Stream -> JobGraph -> ExecutionGraph -> 物理执行图

1、StreamGraph:程序流图,用来表示开发者使用API开发的程序拓扑结构。

2、JobGraph:StreamGraph在提交到JobManager的时候会进行一次优化,将可以合并的算子进行合并,将多个符合条件的节点chain在一起成为一个执行节点。

3、ExecutionGraph:JobManager 将JobGraph根据并行度拆分成并行的任务,到了这一步就是调度层最核心的数据结构。

4、物理执行图:JobManager 将ExecutionGraph部署到实际的TaskManager的Slot上进行执行的物理图。

 在了解了上面Flink的执行图之后我们知道了我们编写的代码经过编译打包之后上传到Flink集群执行的整个过程,以及我们的任务是如何被拆分到对应的Slot上的,但是有个疑问点就是StreamGraph -> JobManager的时候,咱们怎么知道那些程序可以进行合并呢?那就是咱们要知道Flink中的数据传输形式和任务链。

4.3.2、数据传输形式

Flink中的数据传输主要分为两种形式:

1、one - to - one:Stream维护着分区和元素的顺序,例如并行度相同的source和map算子。这就意味着source和map算子任务看到的元素顺序和个数都是相同的,这类的算子任务都属于one - to - one的对应关系(如map、filter、flatMap等等)。

2、Redistributing:若Stream的分区发生变化,每个算子的子任务根据依据选择的transformation发送数据到不同的目标算子。比如keyBy操作是基于HashCode充分区,broastCast和reblance是随机分区。也比如基本转换算子中source(1) -> map(2)虽然他们都属于 one - to - one的关系但是因为下游的分区发生了变化,也会默认按照轮训的逻辑将数据传输到下游算子。

4.3.3、任务链

任务链是Flink采用的一种优化技术,可以在特定条件下减少本地开销。为了满足任务链的要求,上线游的算子必须满足

1、并行度相同。

2、必须是 one - to - one 的对应关系。

如下图:

1、source和FlapMap为设么不能合并因为并行度不同。

2、FlapMap和Key Agg 不能合并因为进行了keyBy。

3、Key Agg和Sink可以合并是因为满足相同的并行度并且是one - to - one的对应关系。

 下图是我们线上执行的任务,因为设置水位线之后发生了keyBy操作所以不能合并,但是前面的source和FlatMap和设置水位线合并,开窗口和窗口聚合函数和Sink是同一个并行度并且是one - to - one操作,可以合并。

5、总结

好了我们关于Flink的运行时架构有了一个比较全面的认识和理解,我们系统学习了

1、Flink的代码编写结构和Flink中的数据流。

2、Flink运行时的4大组件。

3、Flink的集中部署方式,以及任务提交的交互流程。

4、Flink的任务调度原理,包括:任务的并行度概念和设置、任务执行的必要资源和资源的申请以及任务的提交流程过程中生成的执行图和任务执行过程中的数据传输形式以及Flink为了优化所生成的任务链。

基础概念讲解完毕,后续咱们就要开始API的介绍啦,敬请期待。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精选5个AI绘画工具,灵感与创意迸发!

伴随着AI技术的发展,AI绘画工具也走进了人们的视线,今天本文将为大家推荐5个最近火爆的AI绘画神器,一起来看看吧! 1、即时灵感 即时灵感是一个国产的AI绘画神器,非常受国内设计师的欢迎。它支持设计师使用中文描述词…

OpenSource - 分布式重试平台

文章目录 概述重试方案对比设计思想流量管理平台预览场景应用强通知场景发送MQ场景回调场景异步场景 概述 在当前广泛流行的分布式系统中,确保系统数据的一致性和正确性是一项重大挑战。为了解决分布式事务问题,涌现了许多理论和业务实践,其…

【Python】数据可视化利器PyCharts在测试工作中的应用

目录 PyCharts 简介 PyCharts 的安装 缺陷统计 测试用例执行情况 使用JavaScript情况 缺陷趋势分析 将两张图放在一个组合里(grid) 将两张图重叠成一张图(overlap) 将多张图组合在一个page 中(page&#xff0…

马斯克收购AI.com域名巩固xAI公司地位;如何评估大型语言模型的性能

🦉 AI新闻 🚀 AI拍照小程序妙鸭相机上线商业工作站并邀请摄影师进行内测 摘要:AI拍照小程序妙鸭相机将上线面向商业端的工作站,并邀请摄影师进行模板设计的内测。妙鸭相机希望为行业提供更多生态产品,扩大行业规模&a…

探究Spring事务:了解失效场景及应对策略

在现代软件开发中,数据的一致性和完整性是至关重要的。为了保证这些特性,Spring框架提供了强大的事务管理机制,让开发者能够更加自信地处理数据库操作。然而,事务并非银弹,存在一些失效的情景,本文将带您深…

坚鹏:中国邮储银行金融科技前沿技术发展与应用场景第2期培训

中国邮政储蓄银行金融科技前沿技术发展与应用场景第2期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力,是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市,2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

Flink之JDBC Sink

这里介绍一下Flink Sink中jdbc sink的使用方法,以mysql为例,这里代码分为两种,事务和非事务 非事务代码 import org.apache.flink.connector.jdbc.JdbcConnectionOptions; import org.apache.flink.connector.jdbc.JdbcExecutionOptions; import org.apache.flink.connector.…

wireshark简单使用(一)

前两天为同事处理交换机故障,接触到wireshark使用,意识到这个工具对于工程师来说,查询报文还是必须的,了解基本的使用。 于是接触到一些视频,开始自学。 第一步 查询本机IP地址 cmd---ipconfig 查看本机IP地址和网关…

【CI/CD】图解六种分支管理模型

图解六种分支管理模型 任何一家公司乃至于一个小组织,只要有写代码的地方,就有代码版本管理的主场,初入职场,总会遇到第一个拦路虎 git 管理流程,但是每一个企业似乎都有自己的 git 管理流程,倘若我们能掌握…

学习购药系统源码:从前端到后端的技术探索

本文将带领读者探索购药系统源码,从前端到后端逐步深入,了解其核心功能和实现方式。我们将使用常见的Web技术,包括HTML、CSS、JavaScript、以及Python的Django框架,展示购药系统的技术奥秘。 前端技术探索 HTML结构搭建 购药系…

京东开源的、高效的企业级表格可视化搭建解决方案:DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案,项目基于 React 和 JSON Schema,旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目:drip-table、drip-table-gene…

Jmeter(一) - 从入门到精通 - 环境搭建(详解教程)

1.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器…

【蓝图】p48冲刺、瞬移、多段跳

p48冲刺,瞬移,多段跳 p48冲刺,瞬移,多段跳冲刺功能实现瞬移功能实现Set Actor Location(设置Actor位置) 二段跳 p48冲刺,瞬移,多段跳 按shift加速,松开shift恢复普通速度…

swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)

我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样 这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适…

在word的文本框内使用Endnote引用文献,如何保证引文编号按照上下文排序

问题 如下图所示,我在word中插入了一个文本框(为了插图),然后文本框内有引用,结果endnote自动将文本框内的引用优先排序,变成文献[1]了,而事实上应该是[31]。请问如何能让文本框内的排序也自动…

8.4 作业

1.思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash count10 count20 cd ~ for i in $(ls) doif [ -f "$i" ]thencount1$((count11))elif [ -d "$i" ]then count2$((count21))fi done echo $count1 echo $count2 3.输入一…

Java阶段五Day17

Java阶段五Day17 文章目录 Java阶段五Day17师傅后台功能师傅审核列表相关功能启动进程和启动方式 后台审核详情查询查询审核详情流程远程调用图片服务 缓存逻辑缓存逻辑流程查询引入缓存流程完成缓存逻辑面试题整理 附录redis分布式——架构演变 师傅后台功能 师傅审核列表 相…

aws中opensearch 日志通(Centralized Logging with OpenSearch)2.0(一)

aws日志通2.0 实现全面的日志管理和分析功能 一体化日志摄取 :把aws服务器日志和应用日志传输到opensearch域中无代码日志处理 :在网页控制台中就可以实现数据处理开箱即用 :提供可视化模版(nginx、HTTP server ) 架构…

【Docker】Docker容器化技术基础

Docker容器化技术 Docker(软件跨环境迁移)Docker概念:安装Dockerdocker架构配置Docker镜像加速器 一、Docker命令服务daemon相关的命令镜像相关命令Docker容器相关命令 二、Docker容器的数据卷数据卷概念配置数据卷配置数据卷容器 三、Docker…

苍穹外卖day10——订单状态定时处理(Spring Task)、来单提醒和客户催单(WebSocket)

预期效果 对于超时没处理的需要定时程序处理。基于SpringTask实现。 来单提醒和客户催单。基于WebSocket实现。 Spring Task 介绍 Cron表达式 周几通常不能和日一起指定。 cron表达式在线生成器 在线Cron表达式生成器 入门案例 创建定时任务类 /*** 定义定时任务类*/ Slf4j…