Flink 系统架构
对于数据处理系统的架构,最简单的方式就是单节点。当数据量增大,计算逻辑更加复杂多变时,可以考虑增加CPU、加大内存,也就是让一台机器变得性能更加强大从而提高计算性能——这是所谓的对称多处理架构(SMP),但是SMP存在问题很明显:所有CPU 完全平等,所有内存、总线资源共享,这就势必造成资源竞争;而且随着CPU、内存的增大,机器成本会成指数级增长,故此SMP可扩展性是很差的,无法应对海量数据的处理场景。与SMP对应的是分布式的大规模并行处理架构,MPP,之前遇到的Hadoop、Spark 包括现在的Flink都是基于这种架构类型设计的。分布式架构面对的最重要的问题莫过于:集群资源的分配与管理、进程协调调度、持久化和高可用数据存储,以及故障恢复。不过幸运的是:对于这些经典的分布式问题,业内已经有相对成熟的解决方案和服务了,所以Flink不会自己处理所有的问题,而是利用现有的架构和服务 这样Flink可以把精力集中在分布式流数据处理上。flink可以配置为独立模式(Standalone),也可以和现有的资源管理工具集成在一起使用,比如 yarn /k8s/mesos,flink也不会自己提供持久化分布式存储,而是直接使用已有的分布式文件系统——HDFS,或者使用S3,至于高可用配置,flink 依靠的是zookeeper来完成,
1、整体架构
Flink 运行时架构中,最重要的就是两大组件:作业管理器——JobManager和任务管理器——TaskManager。对于一个提交执行的作业,JobManager是真正移移的管理者(Master),负责管理调度。所以在不考虑高可用的情况下只有一个;TaskManager是工作者(Worker),负责具体任务的执行,可以有多个。Flink的作业提交和任务执行的系统如下:
这里客户端其实不是处理系统的一部分,它只负责作业的提交。具体来说就是程序的执行入口main方法,将代码转换为数据流图——Dataflow,并生成作业图——JobGraph,一次发送给JobManager。提交之后任务的执行已经和客户端没什么关系了,可以在客户端选择断开与JobManager的连接,也可以保持连接。客户端随时可以连接到JobManager,获取当前作业的状态和结果,也可以取消作业;JobManager和TaskManager可以以不同的方式启动;
- 作为独立——Standalone集群的进程,直接在机器上启动
- 在容器中启动
- 有资源管理平台调度启动,比如 YARN、K8S
这其实对应了不用的启动方式:TaskManager 启动之后,JobManager与其建立连接,并将作业图转换为执行图分发给TaskManager。然后由TaskManager具体执行任务
2、JobManager.
JobManager是一个集群中任务管理和调度中心,是控制任务执行的主进程,每个应用都有一个JobManager所控制执行,当然,在高可用场景下可能会出现多个JobManager;这时只有一个正在运行的leader,备用接待您是standby,JobManager由三个组件:
1、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)的协调。
2. 资源管理器(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,释放计算资源。
3、TaskManager
askManager是Flink中的工作进程,数据流的具体计算就是它来做的,所以也被称为“Worker”。Flink集群中必须至少有一个TaskManager;当然由于分布式计算的考虑,通常会有多个TaskManager运行,每一个TaskManager都包含了一定数量的任务槽(task slots)。Slot是资源调度的最小单位,slot的数量限制了TaskManager能够并行处理的任务数量。启动之后,TaskManager会向资源管理器注册它的slots;收到资源管理器的指令后,TaskManager就会将一个或者多个槽位提供给JobMaster调用,JobMaster就可以分配任务来执行了。在执行过程中,TaskManager可以缓冲数据,还可以跟其他运行同一应用的TaskManager交换数据。