3 Flink运行架构

一 主要组件

 

 

 

1 作业管理器(JobManager)

一个app有一个jobmanager,

控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager 所控制执行。

JobManager 会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它资源的JAR包。

JobManager 会把JobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(ExecutionGraph),包含了所有可以并发执行的任务。

JobManager 会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

 

2  任务管理器(TaskManager)

Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了TaskManager能够执行的任务数量。 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。

 

3 资源管理器(ResourceManager)

主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是Flink中定义的处理资源单元。 Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及standalone部署。 当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。

slot的数量决定了算子的并发能力.

4 分发器(Dispatcher)

可以跨作业运行,它为应用提交提供了REST接口。 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。 Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。 Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

 

二 任务提交的流程

 

 

1.提交一个app应用到dispatcher,然后dispatcher启动jobManager然后向jobManager提交任务(这里的任务是指JobGraph和依赖的jar包等),jobManager将JobGraph转化成执行图,

2.jobManager 然后向resourceManager请求slot,

3.resourceManager启动Taskmanager,Taskmanager启动之后会向resourceManager注册slot的数量.

4.然后resourceManager向Taskmanager发出提供slot的指令

5.Taskmanager向jobmanager提供slot (如果slot的数量不够,任务无法启动)

6.jobmanager分发任务给Taskmanager

7.Taskmanager开始执行任务

8.各个Taskmanager之后可以发生数据交换.

 

yarn模式

 

 

 

1. Flink clinet上传Flink的job包和配置到hdfs上

2.然后Flink clinet提交Job到yarn的resourceManager

3.yarn的resourceManager启动applicationmaster

4.在起applicationmaster的时候会启动JobManager和flink的resourceManager(图中少画了一个flink的resourceManager)

5.JobManager起来之后会到HDFS上加载F临空的jar包和配置环境来构建环境(起来taskmanager,然后向resourceManager注册slot)

6.JobManager向Flink resourceManager申请资源,然后Flink resourceManager会到yarn的resourceManager申请资源

7.resourceManager把资源分配给JobManager

8.JobManager向taskmanager分发任务.

 

三 任务调度原理

 

 

 1. TaskManager和slots

 

 

 

Flink 中每一个 TaskManager 都是一个JVM进程,它可能会在独立的线程上执行一个或多个 subtask 为了控制一个 TaskManager 能接收多少个 task, TaskManager 通过 task slot 来进行控制(一个 TaskManager 至少有一个 slot)

每个线程执行在固定的计算资源上,这个资源就是slot.slot之间内存是独享的.cpu不是独享的.(所以slot最好配成核心数)

 

 

 

默认情况下,Flink 允许子任务共享 slot,即使它们是不同任务的子任务。 这样的结果是,一个 slot 可以保存作业的整个管道。 Task Slot 是静态的概念,是指 TaskManager 具有的并发执行能力

比如map的并行度为2,而sink的并行度为1,那么map的两个任务被分配到两个slot中.而其中一个任务和sink任务可能会共享一个slot.

所以程序需要的slot的数量等于处理过程所有任务的最大并行度.

如果并行相同,one-to-one操作,可以把相连的算子合成一个任务(任务链).

TM的数量和slot的数量,决定了并行的处理能力(静态的)

真正使用的slot数量由并行度来决定(动态的)

 

四 程序与数据流(DataFlow)

执行图

Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图

StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。

JobGraph:StreamGraph经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化为,将多个符合条件的节点 chain 在一起作为一个节点

ExecutionGraph:JobManager 根据 JobGraph 生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。

物理执行图:JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个TaskManager 上部署 Task 后形成的“图”,并不是一个具体的数据结构。

 

posted @ 2020-07-16 21:22  哥的寂寞你不懂  阅读(186)  评论(0)    收藏  举报