1.2.2 Flink集群架构
如图1-9所示,Flink集群主要包含3部分:JobManager、TaskManager和客户端,三者均为独立的JVM进程。Flink集群启动后,会至少启动一个JobManager和多个TaskManager。客户端将任务提交到JobManager,JobManager再将任务拆分成Task并调度到各个TaskManager中执行,最后TaskManager将Task执行的情况汇报给JobManager。
客户端是Flink专门用于提交任务的客户端实现,可以运行在任何设备上,并且兼容Windows、macOS、Linux等操作系统,只需要运行环境与JobManager之间保持网络畅通即可。用户可以通过./bin/flink run命令或Scala Shell交互式命令行提交作业。客户端会在内部运行提交的作业,然后基于作业的代码逻辑构建JobGraph结构,最终将JobGraph提交到运行时中运行。JobGraph是客户端和集群运行时之间约定的统一抽象数据结构,也就是说,不管是什么类型的作业,都会通过客户端将提交的应用程序构建成JobGraph结构,最后提交到集群上运行。
JobManager是整个集群的管理节点,负责接收和执行来自客户端提交的JobGraph。JobManager也会负责整个任务的Checkpoint协调工作,内部负责协调和调度提交的任务,并将JobGraph转换为ExecutionGraph结构,然后通过调度器调度并执行ExecutionGraph的节点。ExecutionGraph中的ExecutionVertex节点会以Task的形式在TaskManager中执行。
图1-9 Flink集群架构图
除了对Job的调度和管理之外,JobManager会对整个集群的计算资源进行统一管理,所有TaskManager的计算资源都会注册到JobManager节点中,然后分配给不同的任务使用。当然,JobManager还具备非常多的功能,例如Checkpoint的触发和协调等。第3章将详细介绍JobManager管理节点的设计与实现。
TaskManager作为整个集群的工作节点,主要作用是向集群提供计算资源,每个TaskManager都包含一定数量的内存、CPU等计算资源。这些计算资源会被封装成Slot资源卡槽,然后通过主节点中的ResourceManager组件进行统一协调和管理,而任务中并行的Task会被分配到Slot计算资源中。
根据底层集群资源管理器的不同,TaskManager的启动方式及资源管理形式也会有所不同。例如,在基于Standalone模式的集群中,所有的TaskManager都是按照固定数量启动的;而YARN、Kubernetes等资源管理器上创建的Flink集群则支持按需动态启动TaskManager节点。第5章将详细介绍TaskManager的动态伸缩和管理。