大家好,我是雷恩Layne,这是《深入浅出flink》系列的第二篇文章,我旨在用最直白的语言写好flink,希望能让所有看到的人一目了然。如果大家喜欢,欢迎点赞、关注,也欢迎留言,共同交流flink的点点滴滴 O(∩_∩)O
文章目录- 1. Flink运行时的四大核心组件
- 1.1 分发器:Dispatcher
- 1.2 资源管理器:ResourceManager
- 1.3 作业管理器:JobManager
- 1.4 任务管理器:TaskManager
- 2. Flink任务分布式运行流程
文章前半部分描述Flink运行时的四大核心组件,大家在对四个组件有个印象后,再通过一张完整的图来讲解这四大组件是如何协同工作的,即Flink任务分布式的运行流程。
1. Flink运行时的四大核心组件Flink运行时架构主要包括四个不同的核心组件,它们会在运行流处理应用程序时协同工作,分别是:作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager),以及分发器(Dispatcher)。因为Flink是用Java和Scala实现的,所以所有组件都会运行在Java虚拟机上。
1.1 分发器:DispatcherDispatcher主要负责接收客户端提交的JobGraph对象,例如CLI客户端或Flink Web UI提交的任务最终都会发送至Dispatcher组件,由Dispatcher组件对JobGraph进行分发和执行,其中就包含根据JobGraph对象启动JobManager服务,专门用于管理整个任务的生命周期。Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。
1.2 资源管理器:ResourceManagerResourceManager主要负责管理Flink集群中的计算资源。JobManager向ResourceManager发起SlotRequest,ResourceManager会将有空闲slot的TaskManager分配给JobManager。如果ResourceManager没有足够的slot来满足JobManager的请求,它还会向集群资源管理器申请Container并启动TaskManager,以保证任务的正常运行。另外,ResourceManager还负责终止空闲的TaskManager,释放计算资源。
对于不同的集群资源管理器,ResourceManager的实现也会有所不同。如下图所示:
1.3 作业管理器:JobManagerDispatcher会根据接收的JobGraph对象为任务创建JobManager服务,其中JobManager服务管理了整个任务的生命周期(类似于Yarn的AM),同时负责将JobGraph转换成ExecutionGraph结构。JobManager会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。一旦它获取到了足够的资源,JobManager就会将ExecutionGraph分发到真正运行它们的TaskManager上,同时监控各个Task的运行状况,直到整个作业中所有的Task都执行完毕或停止。另外,JobManager还负责 Checkpoint 的协调,通过定时做快照的方式记录任务状态信息。
1.4 任务管理器:TaskManagerTaskManager负责向整个集群提供Slot计算资源,同时管理了JobManager提交的Task任务。TaskManager启动后会主动向ResourceManager注册Slot信息,即其自身能提供的Slot资源。ResourceManager接收到TaskManager中的Slot计算资源时,就会立即向该TaskManager发送Slot资源申请,为JobManager服务分配提交任务所需的Slot计算资源。JobManager最终会根据分配到的Slot计算资源将Task提交到TaskManager上运行。在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。
2. Flink任务分布式运行流程一张图清晰搞定flink运行时的四大核心组件和运行流程:
这是我肝1个小时的图,还是蛮清晰的。
这里我们以Flink Yarn Per-Job-Cluster模式为例,讲述集群在启动时四大组件是如何协同工作的,主要包含如下步骤:
(1)用户通过命令bin/flink run -m yarn-cluster提交Job,此时会触发整个集群服务的启动过程。
(2)Yarn集群收到用户提交的启动flink集群的申请,会选择一个Container启动ApplicationMaster,来管理Flink集群中的进程,并代替Flink进行向外部资源管理器(即Yarn)申请资源。
(3)客户端将用户提交的应用程序代码经过本地运行生成JobGraph结构,然后通过ClusterClient将JobGraph提交到集群运行时中运行。
(4)此时集群运行时中的Dispatcher服务会接收到ClusterClient提交的JobGraph对象,然后根据JobGraph启动JobManager RPC服务(就是一个JVM进程)。JobManager是每个提交的作业都会单独创建的作业管理服务,生命周期和整个作业的生命周期一致。
(5)当JobManager启动后,下一步就是根据JobGraph配置的计算资源向ResourceManager服务申请运行Task实例需要的Slot计算资源。
(6)此时ResourceManager接收到JobManager提交的资源申请后,先判断集群中是否有足够的Slot资源满足作业的资源申请,如果有则直接向JobManager分配计算资源,如果没有则动态地向外部集群资源管理器(即Yarn)申请启动额外的Container以提供Slot计算资源。
(7)当向Yarn申请到Container资源后,就会根据ResourceManager的命令启动指定的TaskManager实例。
(8)TaskManager启动后会主动向ResourceManager注册Slot信息,即其自身能提供的全部Slot资源。
(9)ResourceManager接收到TaskManager中的Slot计算资源时,就会立即向该TaskManager发送Slot资源申请,为JobManager服务分配提交任务所需的Slot计算资源。
(10)当TaskManager接收到ResourceManager的资源分配请求后,TaskManager会对符合申请条件的SlotRequest进行处理,然后立即向JobManager提供Slot资源。
(11)此时JobManager会接收到来自TaskManager的offerslots消息,接下来会向Slot所在的TaskManager申请提交Task实例。TaskManager接收到来自JobManager的Task启动申请后,会在已经分配的Slot卡槽中启动Task线程。
(12)TaskManager中启动的Task线程会周期性地向JobManager汇报任务运行状态,直到完成整个任务运行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)