Flink的执行流程 | 青训营笔记

380 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

  1. 运行时执行引擎

    • Flink 集群主要包含3部分: JobManager、TaskManager 和客户端,三者均为独立的JVM进程。Flink 集群启动后,会至少启动一个JobManager和多个Task-Manager。客户端将任务提交到JobManager, JobManager再将任务拆分成Task并调度到各个TaskManager中执行,最后TaskManager将Task执行的情况汇报给JobManager。
  • 客户端
    • 客户端是Flink专门用于提交任务的客户端实现,可以运行在任何设备上,并且兼容Windows、macOS、Linux 等操作系统,只需要运行环境与JobManager之间保持网络畅通即可。用户可以通过./bin/flink run命令或Scala Shell 交互式命令行提交作业。客户端会在内部运行提交的作业,然后基于作业的代码逻辑构建JobGraph结构,最终将JobGraph提交到运行时中运行。JobGraph 是客户端和集群运行时之间约定的统一抽象 数据结构,也就是说,不管是什么类型的作业,都会通过客户端将提交的应用程序构建成JobGraph结构,最后提交到集群上运行。
  • JobManager
    • JobManager是整个集群的管理节点,负责接收和执行来自客户端提交的JobGraph。JobManager也会负责整个任务的Checkpoint协调工作,内部负责协调和调度提交的任务,并将JobGraph转换为ExecutionGraph结构,然后通过调度器调度并执行ExecutionGraph的节点。ExecutionGraph 中的ExecutionVertex节点会以Task的形式在TaskManager中执行。除了对Job的调度和管理之外,JobManager 会对整个集群的计算资源进行统一管理,所有TaskManger的计算资源都会注册到JobManager节点中,然后分配给不同的任务使用。当然,JobManager还具备非常多的功能,例如Checkpoint的触发和协调等
  • TaskManager
    • TaskManager都包含一定数量的内存、CPU等计算资源。这些计算资源会被封装成Slot资源卡槽,然后通过主节点中的ResourceManager组件进行统一协调和管理 ,而任务中并行的Task会被分配到Slot计算资源中。根据底层集群资源管理器的不同,TaskManager的启动方式及资源管理形式也会有所不同。

image.png

从图3-1中可以看出,Flink Session集群的启动流程主要包含如下步骤。

  • 用户通过客户端命令启动Session Cluster, 此时会触发整个集群服务的启动过程,客户端会向集群资源管理器申请Container计算资源以启动运行时中的管理节点。
  • RClusterManagement会为运行时集群分配Application主节点需要的资源并启动主节点服务,例如在HadoopYarn资源管理器中会分配并启动Flink管理节点对应的Container。
  • 客户端将用户提交的应用程序代码经过本地运行生成JobGraph结构,然后通过ClusterClient将JobGraph提交到集群运行时中运行。
  • 此时集群运行时中的Dispatcher服务会接收到ClusterClient提交的JobGraph对象,然后根据JobGraph启动JobManager RPC服务。JobManager 是每个提交的作业都会单独创建的作业管理服务,生命周期和整个作业的生命周期一致。
  • 当JobManagerRPC服务启动后,下一步就是根据JobGraph配置的计算资源向ResourceManager服务申请运行Task实例需要的Slot计算资源。
  • 此时ResorcManager.按收到JobManager提交的资源申请后, 先判断集群中是否有足够的Slot满足作业的资源申请, 如果有则直接向JobManager分配计算资源,足够的则动态地向外部集群资源管理器申请启动额外的Comtainr 以提供Slot计算资源。
  • 如果在集群资源管理器(例如Hadoop Yarm)中有足够的Container计算资源,就会根据ResourceManager的命令启动指定的TaskManager实例。
  • TaskManager启动后会主动向ResourceManager注册Slot信息,即其自身能提供的全部Slot资源。ResourceManager 接收到TaskManager中的Slot计算资源时,就会立即向该TaskManager发送Slot资源申请,为JobManager服务分配提交任务所需的Slot计算资源。
  • 当TaskManager接收到ResourceManager的资源分配请求后,TaskManager 会对符合申请条件的SlotRequest 进行处理,然后立即向JobManager提供Slot资源。
  • 此时JobManager会接收到来自TaskManager的offerslots消息,接下来会向Slot所在的TaskManager申请提交Task实例。TaskManager 接收到来自JobManager的在的TaskManager申请提交Task实例。TaskManager 接收到来自JobManager的Task启动申请后,会在已经分配的Slot卡槽中启动Task线程。
  • TaskManager中启动的Task线程会周期性地向JobManager汇报任务运行状态,直到完成整个任务运行。

以上就是运行时集群的启动过程,包括对集群中主要组件的初始化和启动以及用户作业提交和执行的全部流程。