一个Flink Cluster是由一个Flink Master和多个TaskManager组成的,Flink Master和TaskManager是集成级组件,其他组件都是进程内的组件
Flink Master中每一个JobManager单独管理一个具体的Job,JobManager中的Scheduler组件负责调度执行该Job的DAG中所有Task,发出资源请求,即整个资源调度的起点;JobManager中Slot Pool组件 持有该 Job 的所有资源。另外,FlinkMaster中唯一的ResourceManager负责整个 Flink Cluster 的资源调度以及与外部调度系统对接,这里的外部调度系统指的是 Kubernetes、 Mesos、Yarn 等资源管理系统
1、Master
JobManager
- 负责一个具体的Job的执行,在一个集群中,可能会有多个JobManager同时执行
- JobManager的职责主要是接收Flink作业,调度Task,收集作业状态和管理 TaskManager
- 只有在接受到CLient端提交的任务才会启动
ResourceManager
- Flink的集群资源管理器,Taskslot的管理和资源申请等工作,都由它负责
- TaskManager启动后会不停的对ResourceManager进行心跳通信
Dispatcher
- Dispatcher服务提供REST接口来接收client的job提交,它负责启动JobManager和提交 job,同时运行Web UI
- 负责接收用户提交的JobGragh, 然后启动一个JobManager来管理应用程序
WebMonitorEndpoint
如果客户端通过 flink run 的方式来提交一个 job 到 flink集群,最终是由
WebMonitorEndpoint来接收,并且决定使用哪一个 Handler 来执行处理
总结
Flink集群的节点运行 : ResourceManager和Dispatcher,当Client提交一个job到集 群运行的时候(客户端会把该Job构建成一个JobGragh 对象),Dispatcher负责调度 JobManager来管理这个Job的执行,JobManager向ResourceManager申请执行Task 所需要的资源
2、详说JobMaster、REST和ResourceManager组件
JobManager(Master节点)包括REST、Dispatcher、ResourceManager和 JobMaster,而TaskManager(Worker节点)主要有TaskExecutor
- REST的主体部分WebMonitorEndpoint接收客户端的HTTP请求,提供各种REST服务,如作 业、集群的指标、各种作业信息的情况、操作作业等
- Dispatcher的主要功能是接收REST转发的操作JobMaster请求,启动和管理JobMaster。 JobMaster主要负责作业的运行调度和检查点的协调
- ResourceManager在不同部署模式下对资源进行管理(主要包括申请、回收资源及资源状态 管控)
- TaskExecutor对资源(CPU、内存等)以逻辑的Slot进行划分,Slot供作业的Task调度到其上 运行
REST
- REST是JobManager暴露给外部的服务,主要为客户端和前端提供HTTP服务。REST部分源代码的核心WebMonitorEndpoint类
- WebMonitorEndpoint继承RestServerEndpoint类,实现JsonArchivist和LeaderContender接口,其中 : RestServerEndpoint是基于Netty实现的抽象类,是整个暴露REST服务的核心部分;LeaderContender接口定义了WebMonitorEndpoint在(Leader)选举方面的处理方法;JsonArchivist接口定义了基于ExecutionGraph生成JSON的接口,供查询作业执行信息的 Handler来实现
- MiniDispatcherRestEndpoint是作为Per-Job模式(一个作业对应一个集群的模式)的实现
- DispatcherRestEndpoint是作为Session模式的实现
-
WebMonitorEndpoint的核心是启动过程,启动完成即可为外部提供REST服务,WebMontiorEndpoint的启动过程如下 :
- 初始化处理外部请求的Handler
- 将处理外部请求Handler注册到路由器(Router)
- 创建并启动NettyServer
- 启动首领选举服务
ResourceManager
- ResourceManager组件负责资源的分配与释放,以及资源状态的管理
- ResourceManager组件的基础类为ResourceManager
- ResourceManager类实现的是ResourceManagerGateway接口,实现的方法供 Dispatcher、REST、JobMaster组件调用
- ResourceManager的子类有StandaloneResourceManager、MesosResourceManager、 YarnResourceManager,作为不同部署模式的实现,实现在各种部署模式下与资源管控的交互
-
ResourceManager与其他组件的通信主要有以下几种 :
- REST组件通过Dispatcher透传或者直接与ResourceManager通信来获取TaskExecutor的详细信息、集群的资源情况、TaskExecutor Metric查询服务的信息、TaskExecutor 的日志和标志输出。具体体现在Flink UI上
- JobMaster与ResourceManager的交互主要体现在申请Slot、释放Slot、将JobMaster注册到ResourceManager,以及组件之间的心跳
- TaskExecutor与ResourceManager的交互主要是将TaskExecutor注册到 ResourceManager、汇报TaskExecutor上Slot的情况,以及组件之间心跳通信
- 对于资源Slot,在TaskExecutor上以Slot逻辑单元对TaskManager资源(资源CPU、内 存等)进行划分,供作业的Task调度;在JobMaster和ResourceManager上维护与TaskExecutor的Slot的映射关系,JobManager通过SlotPool来管理运行作业的Slot, ResourceManager通过SlotManager来管理TaskManager注册过来的Slot,供多个 JobMaster的SlotPool来申请和分配
JobMaster
- JobMaster组件主要负责单个作业的执行
- JobMaster组件对应的基础类为JobMaster类
- JobMaster类继承FencedRpcEndpoint类来实现带Token(Fencing Token)检查的 RpcEndpoint
- JobMaster类实现JobMasterGateway接口,来提供其他组件调用的RPC方法
- JobMaster类实现JobMasterService接口,来供JobManagerRunner调用
- JobManagerRunner负责JobMaster的创建与启动,以及与JobMaster首领选举相关的处理
-
在JobMaster组件中,最核心的组件为Scheduler和CheckpointCoordinator
- 其中Scheduler负责ExecutionGraph的调度,JobMaster的Scheduler的一个核心逻辑是为作业的任务调度申请Slot
- 而CheckpointCoordinator负责作业检查点的协调
- JobMaste是申请Slot的流程的发起方,其中的SlotPool作为作业执行图在调度时提供Slot功能 以及对Slot的生命周期管理,与作业一一对应(一个作业有一个SlotPool实例),其实现类为 SlotPoolImpl
3、TaskManager
- TaskExecutor组件是TaskManager的核心部分,主要负责多个Task(任务)的执行
- TaskExecutor组件的基础类为TaskExecutor类
- TaskExecutor类继承RpcEndpoint抽象类,由实现的AkkaRpcService来支持RpcEndpoint的实现
- TaskExecutor类实现TaskExecutorGateway接口,提供其他组件(如JobMaster、 ResourceManager等)RPC的方法
- TaskManagerRunner是各种部署模式下TaskManager的执行入口,负责构建TaskExecutor的网 络、I/O管理、内存管理、RPC服务、HA服务以及启动TaskExecutor
- TaskExecutor组件负责与ResourceManager、JobMaster的通信,资源Slot的申请和汇报,Task 的部署和操作及状态的变更,以及检查点相关的协调等
-
TaskExecutor与ResourceManager、JobMaster的通信时机的情况如下 :
- 与ResourceManager初次建立通信是在ResourceManager向部署模式申请和启动 TaskExecutor,TaskExecutor启动后,通过HA服务监听到ResourceManager的首领信息,主动发送消息建立联系
- TaskExecutor与JobMaster建立通信的时机是ResourceManager向TaskExecutor申请Slot时,TaskExecutor会根据申请Slot中的作业信息,获取JobMaster的通信地址,主动发送信息建立通信,并将Slot提供给JobMaster
-
TaskSlot组织结构与状态
Slot是划分TaskExecutor资源的基本逻辑单元。TaskExecutor中所有Slot的情况由
TaskSlotTable类来组织管理。TaskSlotTable类由以下属性组成,管理所有Slot的情况 :- timerService : 负责将处于已分配状态(ALLOCATED)的Slot加入超时检测服务。 TaskExecutor将Slot提供给JobMaster,一旦Slot提供JobMaster成功,将移除超时检 测,否则最终会超时。超时会调用freeSlot方法将该Slot置为空闲状态(FREE)
- taskSlots : 维护所有TaskSlot的列表,供Slot请求通过Slot下标来占有相应的Slot。
- allocationIDTaskSlotMap : 记录分配ID与TaskSlot的映射情况,供通过分配ID查询 TaskSlot的情况。
- taskSlotMappings : 记录执行任务的唯一确定ID与任务和TaskSlot的映射,供通过执行 任务的唯一确定ID查询任务绑定TaskSlot的情况
- slotsPerJob : 记录作业占有Slot的情况
- slotActions : 负责Slot的释放与超时的逻辑
- started : 标记TaskSlotTable是否已经启动
-
接收来自ResourceManager的Slot请求
- 对Slot的操作和状态变化以及于其他组件通信的逻辑
- TaskExecutor接收来自ResourceManager的Slot请求入口,TaskExecutor的requestSlot()方法
如感兴趣,点赞加关注,非常感谢!!!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net