Flink集群架构

Flink集群架构

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

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

  • 执行Application 的Main方法。

  • Generate JobGraph。将用户编写的application code(DataStream/DataSet/SQL/Table API)代码翻译成JobGraph。

  • Optimize JobGraph。比如将进行Operator Chain,能够减低数据延迟的同时增加系统吞吐。

  • 提交JobGraph和dependency jar到JobManager。

JobManager

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

  • JobGraph -> Execution Graph。接收Client的JobGraph后,将逻辑执行图JobGraph转换为物理执行图ExecutionGraph。

  • Job分发(Job dispatcher)。

  • Task的部署和调度。

  • Checkpoint Coordinator。

  • Recovery metadata。

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

  • ResourceManager。ResourceManager负责Flink cluster中的资源调配工作,而资源调配的基本单位就是task slot。Flink为不同的环境和资源提供者(比如YARN、Mesos、Kubernetes和standalone cluster)提供了多种实现。比如在standalone部署环境下,ResourceManager只能分配可用TaskManager的task slot,不能去启动一个新的TaskManager。

  • Dispatcher。Dispatcher提供了一个REST接口来让Client提交任务,并为提交的任务启动一个新的JobMaster。同时Dispatcher还未任务提供了Flink WebUI来展示任务执行信息。

  • JobMaster。JobMaster负责管理和执行单个JobGraph。Flink Cluster能够同时运行多个job,每个job都有自己的JobMaster。

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

TaskManager

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

TaskManager的主要功能如下:

  • 执行task(Task Execution)。

  • 数据交换(Network manager)。

  • 内存管理(包括类型系统、数据序列化和反序列化)。

  • 向JobManager中的ResourceManager注册自己,以便ResourceManager进行task调度。

  • 向ResourceManager发送心跳。

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

Task

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

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

JobGraph

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

Task Slot

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

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

slot

如果一个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共享

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

  1. Flink集群只要保证slot总数与job中最大的并发度一致即可,无需计算job中所有task总和。
  2. 提升集群资源利用率。避免非密集型计算task(比如source-map)和密集型计算task(比如window)使用相同的资源。

你可能感兴趣的:(Flink集群架构)