Flink 运行时的组件
Flink 运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:
作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager),
以及分发器(Dispatcher)。因为 Flink 是用 Java 和 Scala 实现的,所以所有组件都会运行在
Java 虚拟机上。每个组件的职责如下:
作业管理器(JobManager)
控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的
JobManager 所控制执行。JobManager 会先接收到要执行的应用程序,这个应用程序会包括:
作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它
资源的 JAR 包。JobManager 会把 JobGraph 转换成一个物理层面的数据流图,这个图被叫做
“执行图”(ExecutionGraph),包含了所有可以并发执行的任务。JobManager 会向资源管
理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上
的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的
TaskManager 上。而在运行过程中,JobManager 会负责所有需要中央协调的操作,比如说检
查点(checkpoints)的协调。
资源管理器(ResourceManager)
主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是 Flink 中
定义的处理资源单元。Flink 为不同的环境和资源管理工具提供了不同资源管理器,比如
YARN、Mesos、K8s,以及 standalone 部署。当 JobManager 申请插槽资源时,ResourceManager
会将有空闲插槽的 TaskManager 分配给 JobManager。如果 ResourceManager 没有足够的插槽
来满足 JobManager 的请求,它还可以向资源提供平台发起会话,以提供启动 TaskManager
进程的容器。另外,ResourceManager 还负责终止空闲的 TaskManager,释放计算资源。
任务管理器(TaskManager)
Flink 中的工作进程。通常在 Flink 中会有多个 TaskManager 运行,每一个 TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了 TaskManager 能够执行的任务数量。 启动之后,TaskManager 会向资源管理器注册它的插槽;收到资源管理器的指令后, TaskManager 就会将一个或者多个插槽提供给 JobManager 调用。JobManager 就可以向插槽 分配任务(tasks)来执行了。在执行过程中,一个 TaskManager 可以跟其它运行同一应用程 序的 TaskManager 交换数据。
分发器(Dispatcher)
可以跨作业运行,它为应用提交提供了 REST 接口。当一个应用被提交执行时,分发器 就会启动并将应用移交给一个 JobManager。由于是 REST 接口,所以 Dispatcher 可以作为集 群的一个 HTTP 接入点,这样就能够不受防火墙阻挡。Dispatcher 也会启动一个 Web UI,用 来方便地展示和监控作业执行的信息。Dispatcher 在架构中可能并不是必需的,这取决于应 用提交运行的方式。
4.2 任务提交流程
我们来看看当一个应用提交执行时,Flink 的各个组件是如何交互协作的:
上图是从一个较为高层级的视角,来看应用中各组件的交互协作。如果部署的集群环境 不同(例如 YARN,Mesos,Kubernetes,standalone 等),其中一些步骤可以被省略,或是 有些组件会运行在同一个 JVM 进程中。