Flink运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:
- 作业管理器(JobManager,管理job的执行,一个job一个jobManager)
- 任务管理器(TaskManager)
- 资源管理器(ResourceManager,flink集群自己的,不要和yarn的RM混淆;用于申请资源,如果flink部署在yarn上,会向yarn的RM申请资源,standalone模式下自己分配资源)
4) 分发器(Dispatcher,当job提交的时候,用于给job分配jobManager,有的模式没有该组件)。
因为Flink是用Java和Scala实现的,所以所有组件都会运行在Java虚拟机上。每个组件的职责如下:
1.作业管理器(JobManager)
(1) 1对1
- 一个JobManager控制一个应用程序执行的主进程.
- 也就是说,每个应用程序(application,ExecutionEnvironment)都会被不同的JobManager所控制执行。
(2) 接收应用程序
应用程序包括:两图+资源
作业图(JobGraph)、逻辑数据流图(logical dataflow graph)+ 打包了所有的类、库和其它资源的JAR包。
JobManager会把JobGraph转换成“执行图”(ExecutionGraph)。
(3) 向资源管理器(ResourceManager)请求资源
资源 = 任务管理器(TaskManager)中的插槽(slot)。
(4) JobManager到了足够的资源将执行图分发到真正运行它们的TaskManager上。
(5) 责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。
2.资源管理器(ResourceManager)
(1)管理任务执行需要的插槽(slot)
插槽是Flink中定义的计算资源的单元。
(2)多种类
Flink提供了多种类的资源管理器,为了适用于将flink部署在各种资源管理框架上,比如YARN、Mesos、K8s,以及standalone部署。(flink的ResourceManager需要向资源管理框架申请资源,因此需要符合通信协议,比如yarn,mesos这些框架里面通信协议是不同的)
(3)请外援
当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。
(4)释放计算资源
ResourceManager还负责终止空闲的TaskManager
3. 任务管理器(TaskManager)
- Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。
- 插槽的数量限制了TaskManager能够执行的任务数量。
- 启动之后,TaskManager会向资源管理器注册它的插槽;
- 收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。
4.分发器(Dispatcher)
- 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。
- 可以跨job运行,它为应用提交提供了REST接口。由于是REST接口,所以Dispatcher可以作为集群的一个HTTP接入点,这样就能够不受防火墙阻挡。
- Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。
- Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。(standalone 和 yarn session模式有,pro-job没有此组件)