2.精通Flink1.19—集群架构

1. 本节课目的

帮助大家对Flink 运行时架构有所了解,包括后面深入剖析源码课程时候用到的核心类、api、组件的概念有所了解。 了解Flink运行时架构 。

了解JobManager、TaskManager内部执行流程 。

了解task slot 、计算资源、并行度区别 。

了解ResourceManager、Dispatcher、JobMaster组件 。

切记:后面我们会接触很多概念核心底层类、以及源码。大家不要死记硬背。看源码最重要的是理解 。

比如有人问到ResourceManager内部组件是做什么的?大家不要在脑海里想有哪些作用,而是脱口而出大致是做什么的。

ResourceManager是管理资源的申请和释放、接收JobManager、TaskManager注册就可以了。因为这样我们是真正的理解。

2.开始本节内容

2.1.Flink 集群、运行架构剖析

如下图是Flink运行时架构图

1.首先整体看是有TaskManager、JobManager进程(Flink客户端用来将JobGraph提叫到JobManager因此客户端不属于运行时架构中的进程)

2.Actor System代表是Flink RPC底层通信(内部是通过Pekko、动态代理、异步编程实现后面源码会分析)

3.NetworkManager网络管理,在TaskManager运行Task的时候内部基于Netty封装了一套任务流转的代码,网络管理就在其中

4.Memory、IO Manager是Flink内存模型相关的封装(后面课程会分析到)

5.Task Slot就是TaskManager执行时候的任务槽

6.Task就是任务执行时候的线程任务

7.Data Streams 数据任务中间进行shuffle 任务交换就用到了网络管理

8.JobManager、TaskManager内部都有一个Actor System,两个进程之间任务状态、心跳、Checkpoint都是基于Flink RPC进行通信、而RPC底层内部封装了ActorySystem

2.2.Flink 任务提交流程

Yarn运行为主说明执行流程

1.用户通过客户端命令启动Session Cluster,会触发集群所有服务的启动,

2.ClusterManager会为运行时各个组件申请运行节点以及资源(比如Yarn 的Container)

3.客户端(CliFrontend)提交应用程序代码(代码最终转换成JobGraph结果),然后通过ClusterClient提交JobGraph到集群中运行

4.集群中的Dispatcher服务接收到JobGraph对象,根据JobGraph对象启动JobMaster

5.JobMaster构建的时候会将JobGraph转换成ExecutionGraph对象

6.之后JobMaster向ResourceManager服务申请计算资源

7.ResourceManager接收到申请后,先判断是否有足够的slot资源,如果有则直接分配给JobMaster,如果没有则向资源管理器申请(比如Yarn Contaioner)

8.申请到资源以后就会启动TaskManager,TaskManager启动后会主动向ResourceManager汇报slot资源

9.ResourceManager收到注册资源后,会立刻向TaskManager发送SlotRequest请求为任务分配资源

10.TaskManager接收到ResourceManager的资源分配请求后,会对符合条件的SlotRequest进行处理,然后向JobMaster发送申请(offerslots)提供Slot资源

11.JobMaster接收到offerslots的消息后,就会向slot所在的TaskManager申请提交Task任务。

12.TaskManager接收到JobMaster发送的启动Task任务申请后,会启动Task线程。

13.TaskManager中的Task线程周期性的向JobMaster汇报任务运行状态,直到任务结束、

2.3.Flink Clients客户端(CliFrontent)

Flink客户端负责将任务提交到集群,与JobManager构建RPC连接,然后将任务提交到JobManager,通过和JobManager之间进行交互获取任务执行状态。Flink客户端Clients不是Flink程序运行时的一部分,作用是向JobManager准备和发送JobGraph,之后,客户端可以断开(detached mode)连接或者保持连接(attached mode)。

客户端提交任务有以下几种方案

1.可以采用CLI方式或者通过使用Flink WebUI提交,

2.在应用程序中指定JobManager的RPC网络端口构建ExecutionEnvironment提交Flink应用。

2.4.JobManager

JobManager负责整个Flink集群任务的调度以及资源的管理,从客户端中获取提交的应用,然后根据集群中TaskManager上TaskSlot的使用情况,为提交的应用分配相应的TaskSlots资源并命令TaskManger启动从客户端中获取的应用。

JobManager相当于整个集群的Master节点,Flink HA 集群中可以有多个JobManager,但整个集群中有且仅有一个活跃的JobManager,其他的都是StandBy。JobManager和TaskManager之间通过Actor System进行通信,获取任务执行的情况并通过Actor System将应用的任务执行情况发送给客户端。同时在任务执行过程中,Flink JobManager会触发Checkpoints操作,每个TaskManager节点收到Checkpoint触发指令后,完成Checkpoint操作,所有的Checkpoint协调过程都是在Flink JobManager中完成。当任务完成后,Flink会将任务执行的信息反馈给客户端,并且释放掉TaskManager中的资源以供下一次提交任务使用。

1.负责整个Flink集群任务的调度以及资源的管理

2.为应用分配TaskSlots资源

3.向TaskManager发送消息启动Task任务

3.触发Checkpoints操作

……

2.5.JobManager由三个不同的组件组成

2.5.1ResourceManager

这里说的ResourceManager不是Yarn资源管理中的ResourceManager,而是Flink中的ResourceManager,其主要负责Flink集群资源分配、管理和回收。在Flink中这里说的资源主要是TaskManager节点上的Task Slot计算资源,Flink中每个提交的任务最终会转换成task,每个task需要发送到TaskManager 上的slot中执行(slot是资源调度最小的单位),Flink为不同的环境和资源提供者(例如:Yarn/Kubernetes和Standalone)实现了对应的ResourceManager,这些ResourceManager负责申请启动TaskManager获取Slot资源。

在Standalone集群中,集群启动会同时启动TaskManager,不支持提交任务时启动TaskManager(没有Per-Job任务提交模式),ResourceManager只能分配可用TaskManager的slots,而不支持自行启动新的TaskManager,而基于其他资源调度框架执行任务时,当ResourceManager管理对应的TaskManager没有足够的slot,会申请启动新的TaskManager进程。

1.负责Flink集群资源分配、管理、回收

2.接收TaskManager节点注册Task Slot计算资源

3.不同的集群模式对应不同的ResourceManager实现

4.定时监听JobMaster、TaskManager的心跳

……

2.5.2.Dispatcher

Dispatcher提供了一个REST接口,用来提交Flink应用程序执行,例如CLI客户端或Flink Web UI提交的任务最终都会发送至Dispatcher组件,由Dispatcher组件对JobGraph进行分发和执行,并为每个提交的作业启动一个新的 JobMaster,它还运行 Flink WebUI 用来提供作业执行信息。

1.提供Rest接口,如提交应用程序的接口(JobGraph)

2.收到JobGraph进行分发、执行并启动JobMaster

3.提供作业执行信息

……

2.5.3.JobMaster

JobMaster负责管理整个任务的生命周期,负责将Dispatcher提交上来的JobGraph转换成ExecutionGraph(执行图)结构,通过内部调度程序对ExecutionGraph执行图进行调度和执行,最终向TaskManager中提交和运行Task实例,同时监控各个Task的运行状况,直到整个作业中所有的Task都执行完毕。

JobManager和ResourceManager组件一样,JobManager组件本身也是RPC服务,具备通信能力,可以与ResourceManager进行RPC通信申请任务的计算资源,资源申请到位后,就会将对应Task任务发送到TaskManager上执行,当Flink Task任务执行完毕后,JobMaster服务会关闭,同时释放任务占用的计算资源。所以JobMaster与对应的Flink job是一一对应的。

1.负责整个任务的声明周期。

2.将JobGrach任务转换成ExecutionGraph

3.通过Scheduler调度ExecutionGraph进行调度和执行

4.向TaskManager中提交Task实例。

5.监控Task运行状态

6.定时向ResourceManager发送心跳

……

2.6.TaskManager

TaskManager负责向整个集群提供Slot计算资源,同时管理了JobMaster提交的Task任务。TaskManager会提供JobManager从ResourceManager中申请和分配的Slot计算资源,JobMaster最终会根据分配到的Slot计算资源将Task提交到TaskManager上运行。另外,TaskManager还可缓存数据,TaskManager之间可以进行DataStream数据的交换。

一个Flink集群中至少有一个TaskManager,在TaskManager中资源调度的最小单位是 task slot ,一个TaskManger中的task Slot个数决定了当前TaskManger最高支持的并发task个数,一个task Slot中可以执行多个算子。

1.负责向ResourceManager注册slot计算资源

2.管理JobMaster分配的Task任务

3.缓存数据、中间计算结果数据交换

4.定时向ResourceManager发送心跳

……

2.6.1.task slot

在 TaskManager 中资源调度的最小单位是 task slot。

task slot

每个任务槽 表示了TaskManager拥有计算资源的一个固定大小的子集。这些资源就是用来独立执行一个子任务的。

2.6.2.Task Slot和物理资源

slot目前仅仅用来隔离内存(平分内存),不会涉及CPU的隔离。在具体应用时,可以将slot数量配置为机器的CPU核心数,尽量避免不同任务之间对CPU的竞争。这也是开发环境默认并行度设为机器CPU数量的原因。

2.6.3.Tasks 和并行度

task slot和并行度都跟程序的并行执行有关,但两者是完全不同的概念。

task slot是静态的概念,是指TaskManager具有的并发执行能力,可以通过参数taskmanager.numberOfTaskSlots进行配置;

并行度是动态概念,指的是TaskManager运行程序时实际使用的并发能力,可以通过参数parallelism.default进行配置。

举例说明:假设一共有3个TaskManager,每一个TaskManager中的slot数量设置为3个,那么一共有9个task slot,表示集群最多能并行执行9个算子。

2.6.4.Tasks 和算子链

对于分布式执行,Flink 将算子的 subtasks 链接tasks。每个 task 由一个线程执行。将算子链接成 task 是个有用的优化:它减少线程间切换、缓冲的开销,并且减少延迟的同时增加整体吞吐量

如下图当满足条件的时候就会将来Source、Map 合并成为一个Operator chain。这样就减少了线程间切换(用户态内核态)

以上就是我们后面源码过程中需要用到的概念。所以大家在理解的基础上心里有印象,以为后面的课程中我们为对每个组件基于源码的深度剖析。

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星&脉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值