购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 Flink运行时架构

Flink有多种运行模式,可以运行在一台机器上,称为本地(单机)模式;也可以使用YARN或Mesos作为底层资源调度系统以分布式的方式在集群中运行,称为Flink On YARN模式(目前企业中使用最多的模式);还可以使用Flink自带的资源调度系统,不依赖其他系统,称为Flink Standalone模式。

本地模式通常用于对应用程序的简单测试。接下来将重点讲解几种常用集群模式的运行架构。

2.1.1 YARN集群架构

在讲解Flink集群架构之前,先了解一下YARN集群架构对后续的学习会有很大的帮助。YARN集群总体上是经典的主/从(Master/Slave)架构,主要由ResourceManager、NodeManager、ApplicationMaster和Container等几个组件构成,YARN集群架构如图2-1所示。

图2-1 YARN集群架构

各个组件解析如下。

1.ResourceManager

以后台进程的形式运行,负责对集群资源进行统一管理和任务调度。ResourceManager的主要职责如下:

· 接收来自客户端的请求。

· 启动和管理各个应用程序的ApplicationMaster。

· 接收来自ApplicationMaster的资源申请,并为其分配Container。

· 管理NodeManager,接收来自NodeManager的资源和节点健康情况汇报。

2.NodeManager

集群中每个节点上的资源和任务管理器,以后台进程的形式运行。它会定时向ResourceManager汇报本节点上的资源(内存、CPU)使用情况和各个Container的运行状态,同时会接收并处理来自ApplicationMaster的Container启动/停止等请求。NodeManager不会监视任务,它仅监视Container中的资源使用情况,例如。如果一个Container消耗的内存比最初分配的更多,就会结束该Container。

3.Task

应用程序具体执行的任务。一个应用程序可能有多个任务,例如一个MapReduce程序可以有多个Map任务和多个Reduce任务。

4.Container

YARN中资源分配的基本单位,封装了CPU和内存资源的一个容器,相当于一个Task运行环境的抽象。从实现上看,Container是一个Java抽象类,定义了资源信息。应用程序的Task将会被发布到Container中运行,从而限定了Task使用的资源量。Container类的部分源码如下:

从上述代码中可以看出,Container类中定义的一个重要属性类型是Resource,内存和CPU的资源信息正是存储于Resource类中。Resource类也是一个抽象类,其中定义了内存和CPU核心数,该类的部分源码如下:

Container的大小取决于它所包含的资源量。一个节点上的Container数量由节点空闲资源总量(总CPU数和总内存)决定。

在YARN的NodeManager节点上拥有许多动态创建的Container。NodeManager会将机器的CPU和内存的一定值抽离成虚拟的值,然后这些虚拟的值根据配置组成多个Container,当应用程序提出申请时,就会对其分配相应的Container。

此外,一个应用程序所需的Container分为两类:运行ApplicationMaster的Container和运行各类Task的Container。前者是由ResourceManager向内部的资源调度器申请和启动的,后者是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster请求NodeManager进行启动。

我们可以将Container类比成数据库连接池中的连接,需要的时候进行申请,使用完毕后进行释放,而不需要每次独自创建。

5.ApplicationMaster

应用程序管理者主要负责应用程序的管理,以后台进程的形式运行,为应用程序向ResourceManager申请资源(CPU、内存),并将资源分配给所管理的应用程序的Task。

一个应用程序对应一个ApplicationMaster。例如,一个MapReduce应用程序对应一个ApplicationMaster(MapReduce应用程序运行时会在NodeManager节点上启动一个名为MRAppMaster的进程,该进程是MapReduce的ApplicationMaster实现),一个Flink应用程序也对应一个ApplicationMaster。

在用户提交一个应用程序时,会启动一个ApplicationMaster实例,ApplicationMaster会启动所有需要的Task来完成它负责的应用程序,并且监视Task运行状态和运行进度,重新启动失败的Task等。应用程序完成后,ApplicationMaster会关闭自己并释放自己的Container,以便其他应用程序的ApplicationMaster或Task转移至该Container中运行,提高资源利用率。

ApplicationMaster自身和应用程序的Task都在Container中运行。

ApplicationMaster可在Container内运行任何类型的Task。例如,MapReduce ApplicationMaster请求一个容器来启动Map Task或Reduce Task。也可以实现一个自定义的ApplicationMaster来运行特定的Task,以便任何分布式框架都可以受YARN支持,只要实现了相应的ApplicationMaster即可。

总的来说,我们可以这样认为:ResourceManager管理整个集群,NodeManager管理集群中的单个节点,ApplicationMaster管理单个应用程序(集群中可能同时有多个应用程序在运行,每个应用程序都有各自的ApplicationMaster)。

YARN集群中应用程序的执行流程如图2-2所示。

1)客户端提交应用程序(可以是MapReduce程序、Spark程序等)到ResourceManager。

2)ResourceManager分配用于运行ApplicationMaster的Container,然后与NodeManager通信,要求它在该Container中启动ApplicationMaster。ApplicationMaster启动后,它将负责此应用程序的整个生命周期。

3)ApplicationMaster向ResourceManager注册(注册后可以通过ResourceManager查看应用程序的运行状态)并请求运行应用程序各个Task所需的Container(资源请求是对一些Container的请求)。如果符合条件,ResourceManager会分配给ApplicationMaster所需的Container(表达为Container ID和主机名)。

4)ApplicationMaster请求NodeManager使用这些Container来运行应用程序的相应Task(即将Task发布到指定的Container中运行)。

此外,各个运行中的Task会通过RPC协议向ApplicationMaster汇报自己的状态和进度,这样一旦某个Task运行失败,ApplicationMaster就可以对其重新启动。当应用程序运行完成时,ApplicationMaster会向ResourceManager申请注销自己。

图2-2 YARN应用程序的执行流程

2.1.2 Flink Standalone架构

Flink Standalone模式为经典的主从(Master/Slave)架构,资源调度是Flink自己实现的。集群启动后,主节点上会启动一个JobManager进程,类似YARN集群的ResourceManager,因此主节点也称为JobManager节点;各个从节点上会启动一个TaskManager进程,类似YARN集群的NodeManager,因此从节点也称为TaskManager节点。从Flink 1.6版本开始,将主节点上的进程名称改为了StandaloneSessionClusterEntrypoint,从节点的进程名称改为了TaskManagerRunner,在这里为了方便使用,仍然沿用之前版本的称呼,即JobManager和TaskManager。Flink Standalone模式的运行架构如图2-3所示。

Client接收到Flink应用程序后,将作业提交给JobManager。JobManager要做的第一件事就是分配Task(任务)所需的资源。完成资源分配后,Task将被JobManager提交给相应的TaskManager,TaskManager会启动线程开始执行。在执行过程中,TaskManager会持续向JobManager汇报状态信息,例如开始执行、进行中或完成等状态。作业执行完成后,结果将通过JobManager发送给Client。

Flink所有组件之间的通信使用的是Akka框架,组件之间的数据交互使用的是Netty框架。

1.Client

Client是提交作业的客户端,虽然不是运行时和作业执行时的一部分,但它负责准备和提交作业到JobManager,它可以运行在任何机器上,只要与JobManager环境连通即可。提交完成后,Client可以断开连接,也可以保持连接来接收进度报告。Client既可以作为触发执行的Java/Scala程序的一部分,也可以在命令行(命令行的使用见3.3节)进程中运行。

图2-3 Standalone模式的架构(Client提交方式)

2.JobManager

JobManager根据客户端提交的应用将应用分解为子任务,从资源管理器(YARN等)申请所需的计算资源,然后分发任务到TaskManager执行,并跟踪作业的执行状态等。

JobManager决定何时调度下一个任务(Task或一组Task),对完成的Task或失败的Task做出反应,并且协调从失败中恢复等。

总的来说,JobManager的主要作用是协调资源分配、任务调度、故障恢复等。整个集群有且仅有一个活跃的JobManager。

3.TaskManager

TaskManager是Flink集群的工作进程。Task被调度到TaskManager上执行。TaskManager相互通信,只为在后续的Task之间交换数据。

TaskManager的主要作用如下:

· 接收JobManager分配的任务,负责具体的任务执行。TaskManager会在同一个JVM进程内以多线程的方式执行任务。

· 负责对应任务在每个节点上的资源申请,管理任务的启动、停止、销毁、异常恢复等生命周期。

· 负责对数据进行缓存。TaskManager之间采用数据流的形式进行数据交互。

4.Task

Flink中的每一个操作算子称为一个Task(任务),例如1.7.3节的单词计数中使用的flatMap()算子、map()算子等。每个Task在一个JVM线程中执行。多个Task可以在同一个JVM进程中共享TCP连接(通过多路复用技术)和心跳信息。它们还可能共享数据集和数据结构,从而降低每个Task的开销。

Task是基本的工作单元,由Flink的Runtime来执行。Task正好封装了一个算子或者算子链(见2.2.1节的任务链)的并行实例。

5.Task Slot

TaskManager为了控制执行的Task数量,将计算资源(内存)划分为多个Task Slot(任务槽),每个Task Slot代表TaskManager的一份固定内存资源,Task则在Task Slot中执行。例如,具有3个Task Slot的TaskManager会将其管理的内存资源分成3等份给每个Task Slot。这种划分方式可以更好地对多个Task进行内存隔离(没有进行CPU隔离),使其不会竞争资源。

由于每个Task Slot只对应一个执行线程,当TaskManager只配置一个Task Slot时,这个TaskManager上运行的Task就独占了整个JVM进程。

Task Slot是一个静态概念,TaskManager在启动的时候就设置好了Task Slot的数量。Task Slot的数量决定了TaskManager具有的并发执行能力。因此,建议将Task Slot的数量设置为节点CPU的核心数,以最大化利用资源,提高计算效率。Task Slot的数量设置可以修改Flink配置文件flink-conf.yaml中的taskmanager.numberOfTaskSlots属性值,默认为1。

2.1.3 Flink On YARN的架构

Flink On YARN模式遵循YARN的官方规范,YARN只负责资源的管理和调度,运行哪种应用程序由用户自己实现,因此可能在YARN上同时运行MapReduce程序、Spark程序、Flink程序等。YARN很好地对每一个程序实现了资源的隔离,这使得Spark、MapReduce、Flink等可以运行于同一个集群中,共享集群存储资源与计算资源。Flink On YARN模式的运行架构如图2-4所示。

图2-4 Flink On YARN模式的架构

1)当启动一个Client(客户端)会话时,Client首先会上传Flink应用程序JAR包和配置文件到HDFS。

2)Client向ResourceManager申请用于运行ApplicationMaster的Container。

3)ResourceManager分配用于运行ApplicationMaster的Container,然后与NodeManager通信,要求它在该Container中启动ApplicationMaster(ApplicationMaster与Flink JobManager运行于同一Container中,这样ApplicationMaster就能知道Flink JobManager的地址)。ApplicationMaster启动后,它将负责此应用程序的整个生命周期。另外,ApplicationMaster还提供了Flink的WebUI服务。

4)ApplicationMaster向ResourceManager注册(注册后可以通过ResourceManager查看应用程序的运行状态)并请求运行Flink TaskManager所需的Container(资源请求是对一些Container的请求)。如果符合条件,ResourceManager会分配给ApplicationMaster所需的Container(表达为Container ID和主机名)。ApplicationMaster请求NodeManager使用这些Container来运行Flink TaskManager。各个NodeManager从HDFS中下载Flink JAR包和配置文件。至此,Flink相关任务就可以运行了。

此外,各个运行中的Flink TaskManager会通过RPC协议向ApplicationMaster汇报自己的状态和进度。 xj9nVyfq+bkL3CE6L1xwYxweyeLIUEMp3UbvV52OE8cm8qXRgo9vOWy8x8yup5UL

点击中间区域
呼出菜单
上一章
目录
下一章
×