《Flink学习笔记》——第四章 Flink运行时架构

4.1 系统架构

Flink运行时架构

《Flink学习笔记》——第四章 Flink运行时架构_第1张图片

Flink 运行时由两种类型的进程组成:一个 JobManager 和一个或者多个 TaskManager

1、作业管理器(JobManager)

JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。尽管在HA模式下,一个应用可以配置多个JobManager,但是实际运行中同一时刻只有一个在使用。

JobManager包含3个不同的组件:

  • JobMaster
  • ResourceManager
  • Dispatcher
(1)JobMaster

JobMaster是JobManager中最核心的组件,负责处理单独的作业(Job)。所以JobMaster和具体的Job是一一对应的,多个Job可以同时运行在一个Flink集群中, 每个Job都有一个自己的JobMaster。

JobMaster会把JobGraph转换成一个物理层面的数据流图,这个图被叫作“执行图”(ExecutionGraph),它包含了所有可以并发执行的任务。JobMaster会向资源管理器(ResourceManager)发出请求,申请执行任务必要的资源。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。

而在运行过程中,JobMaster会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

(2)ResourceManager

ResourceManager主要负责资源的分配和管理,在Flink 集群中只有一个。所谓“资源”,主要是指TaskManager的任务槽(task slots)。任务槽就是Flink集群中的资源调配单元,包含了机器用来执行计算的一组CPU和内存资源。每一个任务(Task)都需要分配到一个slot上执行。

这里注意要把Flink内置的ResourceManager和其他资源管理平台(比如YARN)的ResourceManager区分开。

(3)Dispatcher

提供提交应用的接口,并且为每一个提交的作业启动一个JobMaster。Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。Dispatcher在架构中并不是必需的,在不同的部署模式下可能会被忽略掉

2、任务管理器(TaskManager)

TaskManager是Flink中的工作进程,数据流的具体计算就是它来做的。Flink集群中必须至少有一个TaskManager;每一个TaskManager都包含了一定数量的任务槽(task slots)。Slot是资源调度的最小单位,slot的数量限制了TaskManager能够并行处理的任务数量。

启动之后,TaskManager会向资源管理器注册它的slots;收到资源管理器的指令后,TaskManager就会将一个或者多个槽位提供给JobMaster调用,JobMaster就可以分配任务来执行了。

在执行过程中,TaskManager可以缓冲数据,还可以跟其他运行同一应用的TaskManager交换数据。

Client 不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给 JobManager。之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式)

4.2 核心概念

1、数据并行和任务并行

大量数据往往是需要并行来提高吞吐量、处理效率和更好的利用集群资源,可以通过两种并行方式实现,数据并行和任务并行。

数据并行:将输入数据分组,将同一操作(算子)的多个任务来并行执行在不同的数据子集上。

任务并行:不同算子同时执行

2、并行度

(1)并行子任务和并行度

《Flink学习笔记》——第四章 Flink运行时架构_第2张图片

**并行子任务:**在数据并行中,我们需要将同一算子“复制”多份到多个节点,数据来了之后就可以到其中任意一个执行。这样一来,一个算子任务就被拆分成了多个并行的“子任务”(subtasks),再将它们分发到不同节点,就真正实现了并行计算。这些子任务在不同的线程、不同的物理机或不同的容器中完全独立地执行。

**并行度:**一个算子的子任务数。不同算子可以有不同的并行度。

(2)并行度的设置
  • 代码中设置

    算子后面调用setParallelism()方法

  • 提交应用时设置

    bin/flink run –p 并行度 -c com.xxx.xxx xxx.jar
    
  • 配置文件中设置 flink-conf.yaml

    parallelism.default: 2
    

优先级:代码>命令行>配置

4.3 作业提交流程

1、Standalone会话模式作业提交流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hf6dyI0v-1693058508447)(https://drawing-bed-zlin.oss-cn-shenzhen.aliyuncs.com/img/202308262200798.png)]

2、逻辑流图、作业图、执行图、物理流图

逻辑流图(StreamGraph)→ 作业图(JobGraph)→ 执行图(ExecutionGraph)→ 物理图(Physical Graph)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yB1HPwjd-1693058508447)(https://drawing-bed-zlin.oss-cn-shenzhen.aliyuncs.com/img/202308262200024.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U23tcMGv-1693058508448)(第四章 Flink架构.assets/image-20230715095418312.png)]

1)逻辑流图(Stream Graph)

这是根据用户通过 DataStream API编写的代码生成的最初的DAG图,用来表示程序的拓扑结构。这一步一般在客户端完成。

2)作业图(JobGraph)

StreamGraph经过优化后生成的就是作业图(JobGraph),这是提交给 JobManager 的数据结构,确定了当前作业中所有任务的划分。主要的优化为:将多个符合条件的节点链接在一起合并成一个任务节点,形成算子链,这样可以减少数据交换的消耗。JobGraph一般也是在客户端生成的,在作业提交时传递给JobMaster。

我们提交作业之后,打开Flink自带的Web UI,点击作业就能看到对应的作业图

《Flink学习笔记》——第四章 Flink运行时架构_第3张图片

3)执行图(ExecutionGraph)

JobMaster收到JobGraph后,会根据它来生成执行图(ExecutionGraph)。ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。与JobGraph最大的区别就是按照并行度对并行子任务进行了拆分,并明确了任务间数据传输的方式。

4)物理图(Physical Graph)

JobMaster生成执行图后,会将它分发给TaskManager;各个TaskManager会根据执行图部署任务,最终的物理执行过程也会形成一张“图”,一般就叫作物理图(Physical Graph)。这只是具体执行层面的图,并不是一个具体的数据结构。

物理图主要就是在执行图的基础上,进一步确定数据存放的位置和收发的具体方式。有了物理图,TaskManager就可以对传递来的数据进行处理计算了。

3、Yarn应用模式作业提交流程

《Flink学习笔记》——第四章 Flink运行时架构_第4张图片

你可能感兴趣的:(#,Flink,flink,学习,笔记)