简介:
Flink 运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager),以及分发器(Dispatcher)。因为 Flink 是用 Java 和 Scala 实现的,所以所有组件都会运行在Java 虚拟机上。
作业管理器(JobManager)
- 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制
- JobManager会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其他资源的JAR包
- JobManager会把JobGraph转换成物理层面的数据流图,这个图被叫做‘执行图’(Execution Graph),包含了所有可以并发执行的任务
- JobManager会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)里面的插槽(slot)。一旦获取到了足够的资源,就会讲执行图分发到真正运行它们的TaskManager上。而在运行过程中,JobManager会负责所有需要中央协调的操作,比如检查点(checkpoint)的协调
任务管理器(TaskManager)
- Flink中的工作进程(JVM进程)。通常在Flink中会有多个TaskManager的运行,每一个TaskManager都包含一定数量的插槽(slots),插槽的数量限制了TaskManager能够执行任务的数量
- 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或多个插槽提供给JobManager调用,JobManager就可以向插槽分配任务(tasks)来执行了
- 在执行过程中,一个TaskManager和其他运行同一应用程序的TaskManager交换数据(称为跨TaskManager之间的数据交换)
资源管理器(ResourceManager)
- 主要负责管理任务管理器(TaskManager)的插槽(slot),slot是Flink中定义的处理资源的最小单元
- Flink为不同的环境和资源管理工具提供了不同的资源管理器,比如yarn、mesos、k8s以及standalone部署
- 当JobManager申请slot资源时,ResourceManager会将有空闲的TaskManager分配给JobManager。如果ResourceManager没有足够的slot来满足JobManager的请求,她还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器
分发器(Dispatcher)
- 可以跨作业运行,它为应用题叫提供了REST接口
- 当一个应用被提交执行时,分发器就会分发并将应用移交给一个JobManager
- Dispatcher也会启动一个WebUI,用来方便的战士和监控作业的执行
- Dispatcher在架构中可能并不是必须的,这取决于应用提交运行的方式。
任务提交的过程中,四大组件是如何协调工作的
standalone模式下
1、提交应用 (可以是webUI提交,或者指令提交)
2、启动并提交应用
3、请求slots(请求需要的内存资源)
4、启动(需要TM先启动,将资源注册到RM)
5、注册slots
6、发出slots的指令
7、提供slots
8、提交要在slots中执行的任务
9、交换数据(分为跨TM的交换、TM内的交换---后续文章补充)
完成
YARN模式下
1、上传Flinkjar包和配置
2、提交JOB
3、启动ApplicationMaster(JobManager),起了一个集群
4、申请slot资源(向yarn的RM申请资源)
5、 启动TM(包含注册slots和分配slots过程,和standalone一致)
6、执行任务
结束
任务调度原理
--参考官网的图片
- Program Code --写的java或者scala代码
- Optimizer / Graph Builder ---程序代码会被转位一个有向无环图(DAG)
- Client --将job提交给JobManager,JobManager会返回一些状态给Client
- 到JobManager后,JM(JobManager缩写)会将Job生成一个逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其他资源的JAR包,最终生成‘执行图’(Execution Graph),包含了所有可以并发执行的任务
- 作业会被分发到TM上的slots上执行(具体需要多少slots取决于job的执行图)
- TM与JM有状态的一些状态的同步。
思考两个问题:
1、如何计算job到底需要占多少个slot?
2、一个流处理到底需要包含多少个任务呢?
下节我们一起来探讨一下