Flink 核心机制解析-执行流程
概述
Flink是可以运行在多种不同的环境中的,可以通过单进程多线程的方式直接运行,也可以运行在Yarn或K8s这中资源管理系统上面,也可以在各种云环境中执行,本问主要介绍Flink Runtimed 整体价格以及Job的基本执行流程,然后介绍Flink是怎么进行资源关闭、作业调度以及错误重试。
Flink Runtime整体架构
Flink Runtime 对不同的执行环境提供了一套统一的分布式执行引擎
在Runtime层之上提供了DataStream和DataSet两套API,分别用来编写流作业与批作业,以及一组更高级的API来简化特征作业的编写.
Flink Runtime层
从上面的架构图中,可以看出Fli你看集群的基本结构,整体来说,它采用了标准的master-slava的结构
master: 左侧白色全中的部分即是master,它负责关闭整个集群中的资源和作业
slave:右侧的两个taskExecutor则是Slave,它负责提供具体的自己并实际执行作业
Runtime Master:
APP Master 主要包括三个组件:Dispatche、ResourceManager和JobManager
Dispatche:负责接收用户提交的作业,并负责为这个新提交的作业拉起一个新的JobManager组件
ResourceManager: 负责资源的管理,在整个Flink集群只有一个ResourceManager
JobManager : 负责管理作业的执行,在一个FLink集群中可能有多个作业同时执行,每个作业都有自己的JobManager组件
Flink Runtime执行过程:
1.用户提过作业后,会启动一个Clinent进程负责作业的编译与提交,它首先会将用户编写的代码编译为一个JobGeaph,并会进行一些检查与优化工作,例如判断哪个Operator可以Chain到统一个Task中
2.判断执行模式
2.1 共享Session模式,AM会预先启动,此时Client直接与Dispatcher建立连接并提交作业
2.2 独享Per-Jo模式,AM不会预先启动,此时Client将首先向资源管理系统 申请资源来启动AM,然后在向AM中的Dispatcher提交作业
3.当作业到Dispatcher后,Dispatcher会启动一个JobManager组件,然后JobManager会向ResourceManager申请资源启动作业中的具体任务
4.ResourceManager中会判断执行模型
4.1 共享Session模式,ResourceManager 中已经记录了TaskExecutor注册的资源,可以直接选取空闲的资源进行分配
4.2独享Per-Job模式,ResourceManager需要向外部资源管理系统申请资源来启动taskExecutor,然后等待TaskExecutor注册资源后,在继续选择空闲资源,
目前TaskExecutor的资源是通过Slot来描述,一个slot一般可以执行一个具体的Task,但在一些情况下也可以执行多个相关联的Task
6.ResourceManager选择到空闲的Slot之后,就会通知相应的TM,将改Slot分配给 某个JobManager XX ,然后TaskExecutor进行记录后,会向JsbManage进行注册
7.JpbManager 收到TaskExcecutor注册上来的Slot后,就可以实际提交task了
8.TaskExecutor收到JobManager提交的Task之后,会启动一个新的线程来执行Task,Task启动后就会开始进行预先指定的加,并通过数据Shuffle模块交互数据
Flink 支持两种不同的模式
1.独享模式:独享模式下整个Flink集群只执行单个作业,即每个作业会独享Dispatcher和ResourceManager,并且AppMaste和TaskExecutor都是按需申请,因此独享模式适合执行时间较长的大作业,这些作对稳定性要求比较高,并且对申请资源的时间不敏感
2.共享模式:共享模式Flink预先启动AppMaster以及一组TaskExecutor,然后在整个集群的生命周期中会执行多个作业,共享模式更适合规模小,执行时间段的作业