Flink集群架构

如题所述

第1个回答  2022-07-17
Flink采用Master-Slave架构,其中JobManager作为集群Master节点,主要负责任务协调和资源分配,TaskWorker作为Salve节点,用于执行流task。除了JobManager和TaskManager,还有一个重要的角色就是Client。Client虽然不是Flink Cluster 运行态的一部分,但也是Flink重要组件之一,用来提交流任务。

Flink集群之间的通信,是通过Akka Actor System来进行管控通信的。包括Client-JobManager和JobManager-TaskManager,而TaskManager之间的数据交换,是基于Netty实现的。

Client主要作用是将批或流应用程序编译成Dataflow Graph(也就是JobGraph),然后将其提交给JobManager。详细来看,Client主要功能如下:

JobManager负责协调Flink application的分布式执行,比如task调度、Checkpoint协调、Failover协调等等。具体功能如下:

其中JobManager内部主要功能组件如下:

一个Flink Cluster至少有一个JobManager,在高可用部署模式下,可以有多个JobManager,但是只能有一个JobManager为leader,其它都为standby。

TaskManager主要用于执行Dataflow的task,并且缓冲和交换数据流。TaskManager中的task slot是集群的最小资源调度单位。TaskManager中的task slot数量,代表了该TaskManager所能并发处理的task数量。

TaskManager的主要功能如下:

上面的Client、JobManager和TaskManager中都有一个相同的组件,就是Actor System。Akka Actor System用于节点之间消息传输。

对于分布式任务执行,Flink会将能够chain到一起的operator放到一个Task中来执行,每个Task由一个Thread来执行。

将可以chain到一起的operator放到一个task执行,是一种非常有效的优化手段。因为它能够减少线程到线程的切换开销和缓存开销,能够降低延迟的同时增加吞吐量。

上图是Application Dataflow的JobGraph,最上面是Dataflow的逻辑视图JobGraph,下面是带有并发语义的JobGraph。Task代表Dataflow中operator执行任务,而SubTask代表同一Operator(或Chain operator)的并发任务,比如上面的source-map chain operator代表一个task,source-map[1]代表该task的subtask。

Flink集群中的每个TaskManager是一个JVM进程,TaskManager能够执行一个或多个task。而TaskManager能够执行多少task,就是通过task slot来表示的。

每个task slot代表TaskManager中的固定资源子集,比如TaskManager中有3个task slot,则每个task slot所分配的资源为TaskManager所管理内存的1/3。需要注意的是,这里只隔离了内存,像CPU、I/O等资源都没有做隔离。

如果一个TaskManger只有一个task slot的话,意味着每个task group(之所以称为组,是因为task slot会被共享)是JVM进程级别的隔离。而一个TaskManager如果有多个Task slot,则这些task之间能够共享JVM资源,比如TPC链接、心跳信息等;同时也可以共享数据集和数据结构,从而减少每个task的负载。

对于默认情况下,Flink是允许不同task的subtask共享slot的,只要它们属于同一job即可。通过共享slot,一个slot就可以容纳一个job的整个pipeline,比如下面第一个TaskManager中的第一个Task Slot,被source-map[1]、keyby-window[1]和sink[1]整个pipeline所共享,这样整个最大限度的减少数据跨线程/进程的数据通信。

共享slot除了可能执行整个pipline外,还有以下两个优点:
相似回答