【Flink、YARN】架构及工作原理

参考:http://lionheartwang.github.io/blog/2018/03/05/flink-framwork-introduction/
https://blog.csdn.net/bingduanlbd/article/details/51880019

Flink 架构

Flink是一个流式计算框架,Flink框架的架构是Master-Slaver风格的,如下图所示:【Flink、YARN】架构及工作原理_第1张图片

当 Flink 集群启动后,首先会启动一个 JobManger和一个或多个的 TaskManager。由Client 提交任务给 JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。一个TaskManager进程中开启多个Task线程。

  • Client
    为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程(Streaming的任务),也可以不结束并等待结果返回。
    当用户提交一个Flink程序时,Flink框架会首先创建一个Client进程
    该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager。
    Client会将用户提交的Flink程序组装一个JobGraph, 并且是以JobGraph的形式提交的。
    一个JobGraph是一个Flink Dataflow,它由多个JobVertex组成的DAG。
    其中,一个JobGraph包含了一个Flink程序的如下信息:JobID、Job名称、配置信息、一组JobVertex等。

  • JobManager
    主要负责调度 Job 并协调 Task 做 checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR 包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。
    JobManager是Flink系统的协调者,它负责接收Flink Job,调度组成Job的多个Task的执行。
    同时,JobManager还负责收集Job的状态信息,并管理Flink集群中从节点TaskManager
    JobManager负责各项管理功能,它接收到并处理的事件主要包括:

    • RegisterTaskManager:在Flink集群启动的时候,TaskManager会向JobManager注册,如果注册成功,则JobManager会向TaskManager回复消息AcknowledgeRegistration。
    • SubmitJobFlink框架内部通过Client向JobManager提交Flink Job,其中在消息SubmitJob中以JobGraph形式描述了Job的基本信息。
    • UpdateTaskExecutionState:TaskManager会向JobManager请求更新ExecutionGraph中的ExecutionVertex的状态信息,更新成功则返回true。
    • RequestNextInputSplit:运行在TaskManager上面的Task,请求获取下一个要处理的输入Split,成功则返回NextInputSplit。
    • JobStatusChanged:ExecutionGraph向JobManager发送该消息,用来表示Flink Job的状态发生的变化,例如:RUNNING、CANCELING、FINISHED等。
  • TaskManager
    在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager 处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。
    TaskManager也是一个Actor,它是实际负责执行计算的Worker,在其上执行Flink Job的一组Task。
    每个TaskManager负责管理其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资源的状态向JobManager汇报。
    TaskManager端可以分成两个阶段:

    1. 注册阶段:TaskManager会向JobManager注册,发送RegisterTaskManager消息,等待JobManager返回AcknowledgeRegistration,然后TaskManager就可以进行初始化过程。
    2. 可操作阶段:该阶段TaskManager可以接收并处理与Task有关的消息,如SubmitTask、CancelTask、FailTask。

如果TaskManager无法连接到JobManager,这是TaskManager就失去了与JobManager的联系,会自动进入“注册阶段”,只有完成注册才能继续处理Task相关的消息。

YARN架构

RM是一个YARN集群的唯一的全局资源管理器,NM是每个节点上一个的节点资源管理器,每个应用程序对应一个应用管理器AM
YARN(Yet Another Resource Negotiator)是一个通用的资源管理平台,可为各类计算框架提供资源的管理和调度。其核心出发点是为了分离资源管理与作业调度/监控,实现分离的做法是拥有一个全局的资源管理器(ResourceManager,RM),以及每个应用程序对应一个的应用管理器(ApplicationMaster,AM),应用程序由一个作业(Job)或者Job的有向无环图(DAG)组成。
YARN两大功能:

  • 资源的统一管理和调度:
    集群中所有节点的资源(内存、CPU、磁盘、网络等)抽象为Container。计算框架需要资源进行运算任务时需要向YARN申请Container, YARN按照特定的策略对资源进行调度进行Container的分配。
  • 资源隔离:
    YARN使用了轻量级资源隔离机制Cgroups进行资源隔离以避免相互干扰,一旦Container使用的资源量超过事先定义的上限值,就将其杀死。

YARN架构如下图所示:
【Flink、YARN】架构及工作原理_第2张图片

YARN总体上是Master/Slave结构,主要由ResourceManager、NodeManager、 ApplicationMaster和Container等几个组件构成。

  • Container
    Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container 表示的。

  • ResourceManager(RM)
    YARN的一个全局的资源管理器,负责对各NM上的资源进行统一管理和调度。将AM分配空闲的Container运行并监控其运行状态。对AM申请的资源请求分配相应的空闲Container。主要由两个组件构成:调度器和应用程序管理器:

    1. 调度器(Scheduler):调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container,从而限定每个任务使用的资源量。Shceduler不负责监控或者跟踪应用程序的状态,也不负责任务因为各种原因而需要的重启(由ApplicationMaster负责)。总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为应用程序分配封装在Container中的资源。
    2. 应用程序管理器(Applications Manager):应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动AM、监控AM运行状态并在失败时重新启动等,跟踪分给的Container的进度、状态也是其职责。
  • NodeManager (NM)
    NM是每个计算节点上的一个进程,负责每个节点上的资源和任务管理器。它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;同时会接收并处理来自AM的Container 启动/停止等请求

  • ApplicationMaster (AM)
    用户提交的应用程序均包含一个AM,负责应用的监控,跟踪应用执行状态,重启失败任务等。ApplicationMaster是应用框架,它负责向ResourceManager协调资源,并且与NodeManager协同工作完成Task的执行和监控。

YARN应用工作流程(如下图所示):
RM为应用程序分配第一个Container,并与对应的NM通信,要求它在这个Container中启动AM;AM首先向RM注册,然后它将为各个任务申请资源;—旦AM申请到资源后,便与对应的NM通信,要求它启动任务;NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;
【Flink、YARN】架构及工作原理_第3张图片

YARN可以看成一个云操作系统,由一个ResourceManager和多个NodeManager组成, YARN负责管理所有NodeManger上多维度资源, 并以Container(启动一个Container相当于启动一个进程)方式分配给应用程序启动ApplicationMaster(相当于主进程中运行逻辑) 或运行ApplicationMaster切分的各Task(相当于子进程中运行逻辑)。

Flink on YARN

Flink on YARN的部署模式,如下图所示:
【Flink、YARN】架构及工作原理_第4张图片
Flink实现了满足在YARN集群上运行的各个组件:

  • Flink YARN Client负责与YARN RM通信协商资源请求
  • Flink JobManager和Flink TaskManager分别申请到Container去运行各自的进程。

通过上图可以看到,YARN AM与Flink JobManager在同一个Container中,这样AM可以知道Flink JobManager的地址,从而AM可以申请Container去启动Flink TaskManager。
待Flink成功运行在YARN集群上,Flink YARN Client就可以提交Flink Job到Flink JobManager,并进行后续的映射、调度和计算处理。

你可能感兴趣的:(分布式,并行,大数据,Flink,YARN)