Flink系统架构以及各个角色职责
flink系统机构讲解
·
系统架构
Flink
的运行时架构中,最重要的就是两大组件:作业管理器(
JobManger
)和任务管理器
(
TaskManager
)。对于一个提交执行的作业,
JobManager
是真正意义上的“管理者”(
Master
), 负责管理调度,所以在不考虑高可用的情况下只能有一个;而 TaskManager
是“工作者” (Worker
、
Slave
),负责执行任务处理数据,所以可以有一个或多个。
Flink
的作业提交和任务
处理时的系统如图
4-1
所示。
这里首先要说明一下“客户端”。其实客户端并不是处理系统的一部分,它只负责作业的
提交。具体来说,就是调用程序的
main
方法,将代码转换成“数据流图”(
Dataflow Graph
),
并最终生成作业图(
JobGraph
),一并发送给
JobManager
。提交之后,任务的执行其实就跟客
户端没有关系了;我们可以在客户端选择断开与
JobManager
的连接
,
也可以继续保持连接。
之前我们在命令提交作业时,加上的
-d
参数,就是表示分离模式(
detached mode)
,也就是断
开连接。
当然,客户端可以随时连接到
JobManager
,获取当前作业的状态和执行结果,也可以发
送请求取消作业。我们在上一章中不论通过
Web UI
还是命令行执行“
flink run
”的相关操作,
都是通过客户端实现的。
JobManager
和
TaskManagers
可以以不同的方式启动:
⚫
作为独立(
Standalone
)集群的进程,直接在机器上启动
⚫
在容器中启动
⚫ 由资源管理平台调度启动,比如 YARN
、
K8S
这其实就对应着不同的部署方式。
TaskManager
启动之后,
JobManager
会与它建立连接,并将作业图(
JobGraph
)转换成可
执行的
“
执行图
”
(
ExecutionGraph
)分发给可用的
TaskManager
,然后就由
TaskManager
具体
执行任务。接下来,我们就具体介绍一下
JobManger
和
TaskManager
在整个过程中扮演的角色。
作业管理器(Jobmanager)
JobManager
是一个
Flink
集群中任务管理和调度的核心,是控制应用执行的主进程。也就
是说,每个应用都应该被唯一的
JobManager
所控制执行。当然,在高可用(
HA
)的场景下,
可能会出现多个
JobManager
;这时只有一个是正在运行的领导节点(
leader
),其他都是备用
节点(
standby
)。
JobManger
又包含
3
个不同的组件,下面我们一一讲解。
JobMaster
JobMaster
是
JobManager
中最核心的组件,负责处理单独的作业(
Job
)。所以
JobMaster
和具体的
Job
是一一对应的,多个
Job
可以同时运行在一个
Flink
集群中
,
每个
Job
都有一个
自己的
JobMaster
。需要注意在早期版本的
Flink
中,没有
JobMaster
的概念;而
JobManager
的概念范围较小,实际指的就是现在所说的
JobMaster
。
在作业提交时,
JobMaster
会先接收到要执行的应用。这里所说“应用”一般是客户端提
交来的,包括:
Jar
包,数据流图(
dataflow graph
),和作业图(
JobGraph
)。
JobMaster
会把
JobGraph
转换成一个物理层面的数据流图,这个图被叫作“执行图”
(
ExecutionGraph
),它包含了所有可以并发执行的任务。
JobMaster
会向资源管理器
(
ResourceManager
)发出请求,申请执行任务必要的资源。一旦它获取到了足够的资源,就会
将执行图分发到真正运行它们的
TaskManager
上。
而在运行过程中,
JobMaster
会负责所有需要中央协调的操作,比如说检查点(
checkpoints
)
的协调。
资源管理器(ResourceManager)
ResourceManager
主要负责资源的分配和管理,在
Flink
集群中只有一个。所谓“资源”,
主要是指
TaskManager
的任务槽(
task slots
)。任务槽就是
Flink
集群中的资源调配单元,包含
了机器用来执行计算的一组
CPU
和内存资源。每一个任务(
Task
)都需要分配到一个
slot
上
执行。
这里注意要把 Flink 内置的 ResourceManager 和其他资源管理平台(比如 YARN)的
ResourceManager 区分开。
Flink
的
ResourceManager
,针对不同的环境和资源管理平台(比如
Standalone
部署,或者
YARN
),有不同的具体实现。在
Standalone
部署时,因为
TaskManager
是单独启动的(没有
Per-Job
模式),所以
ResourceManager
只能分发可用
TaskManager
的任务槽,不能单独启动新
TaskManager
。
而在有资源管理平台时,就不受此限制。当新的作业申请资源时,
ResourceManager
会将
有空闲槽位的
TaskManager
分配给
JobMaster
。如果
ResourceManager
没有足够的任务槽,它
还可以向资源提供平台发起会话,请求提供启动
TaskManager
进程的容器。另外,
ResourceManager
还负责停掉空闲的
TaskManager
,释放计算资源。
分发器(Dispatcher)
Dispatcher
主要负责提供一个
REST
接口,用来提交应用,并且负责为每一个新提交的作
业启动一个新的
JobMaster
组件。
Dispatcher
也会启动一个
Web UI
,用来方便地展示和监控作
业执行的信息。
Dispatcher
在架构中并不是必需的,在不同的部署模式下可能会被忽略掉。
任务管理器(TaskManager)
TaskManager
是
Flink
中的工作进程,数据流的具体计算就是它来做的,所以也被称为
“
Worker
”。
Flink
集群中必须至少有一个
TaskManager
;当然由于分布式计算的考虑,通常会
有多个
TaskManager
运行,每一个
TaskManager
都包含了一定数量的任务槽(
task slots
)。
Slot
是资源调度的最小单位,
slot
的数量限制了
TaskManager
能够并行处理的任务数量。
启动之后,
TaskManager
会向资源管理器注册它的
slots
;收到资源管理器的指令后,
TaskManager
就会将一个或者多个槽位提供给
JobMaster
调用,
JobMaster
就可以分配任务来执
行了。
在执行过程中,
TaskManager
可以缓冲数据,还可以跟其他运行同一应用的
TaskManager
交换数据。
更多推荐
已为社区贡献1条内容
所有评论(0)