• Flink运行时架构


    系统架构

    Flink整体架构

    • Flink整体架构中,最为重要的是JobManager和TaskManager。JobManager负责管理提交执行的作业,负责管理调度,因此在不开启高可用的情况下,一般只会有一个。TaskManager则是负责执行任务处理数据,所以可以存在多个。

    Flink程序中的客户端实际上只是调用程序的main()方法,将代码转换成“数据流图”(Dataflow Graph),并最终生成作业图(JobGraph),一并发送给JobManager。

    • JobManager和TaskManager的启动方式:
      1. 作为独立的集群(即standalone模式)进程,直接在机器上启动
      2. 在容器中启动
      3. 由yarn、K8S等资源调度平台调度启动

    JobManager

    又叫做master,是一个Flink集群的任务管理和调度核心,负责控制应用执行的主进程。每个应用都有唯一的JobManager进行管理控制。

    其协调Flink应用执行的主要职责如下:

    1. 负责调度任务,决定何时安排下一个任务,对完成or失败的任务做出对应操作。
    2. 负责协调分布式计算
    3. 协调检查点
    4. 协调故障恢复

    需要注意的是,虽然每个应用(job)都对应一个JobManager,但一个JobManager在不同的部署方式下可能存在管理多个Job的情况

    jobMaster

    JobManager的核心组件,负责处理单独的作业(JobMaster和具体的Job一一对应),虽然多个job可以运行在同一个Flink集群中,但是每个Job都有一个独享的JobMaster。

    当一个作业提交时,JobMaster会先接收到要执行的应用。JobMaster会把JobGraph转换成一个物理层面的数据流图,这个图被叫作“执行图”(ExecutionGraph),其包含了所有可以并发执行的任务。JobMaster会向资源管理器(ResourceManager)发出请求,申请执行任务必要的资源。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。

    而在运行过程中,JobMaster会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

    ResourceManager

    类似于yarn中资源管理器(ResourceManager),但不同的是他是运行在yarn调配给他的资源上的另一个更小一级的资源管理器(ResourceManager)。

    在Flink集群中只有一个。所谓“资源”,主要是指TaskManager的任务槽(task slots)。任务槽就是Flink集群中的资源调配单元,包含了机器用来执行计算的一组CPU和内存资源。每一个任务(Task)都需要分配到一个slot上执行。

    Dispatcher(分发器)

    Dispatcher主要负责*提供一个REST接口,用来提交应用*,并且负责为每一个新提交的作业启动一个新的JobMaster组件。Dispatcher也会*启动一个Web UI,用来方便地展示和监控作业执行的信息**。

    Dispatcher在架构中并不是必需的,在不同的部署模式下可能会被忽略掉。

    TaskManager

    TaskManager是Flink中的工作进程,数据流的具体计算就是它来做的,所以也被称为“Worker”。

    Flink集群中必须至少有一个TaskManager;每一个TaskManager都包含了一定数量的任务槽(task slots)。Slot是资源调度的最小单位,slot的数量限制了TaskManager能够并行处理的任务数量。

    启动之后,TaskManager会向资源管理器注册它的slots;收到资源管理器的指令后,TaskManager就会将一个或者多个槽位提供给JobMaster调用,JobMaster就可以分配任务来执行了。

    在执行过程中,TaskManager可以缓冲数据,还可以跟其他运行同一应用的TaskManager交换数据。

    作业提交流程

    抽象视角

    1. 一般情况下,由客户端(App)通过分发器提供的REST接口,将作业提交给JobManager。
    2. 由分发器启动JobMaster,并将作业(包含JobGraph)提交给JobMaster。
    3. JobMaster将JobGraph解析为可执行的ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)。
    4. 资源管理器判断当前是否由足够的可用资源;如果没有,启动新的TaskManager。
    5. TaskManager启动之后,向ResourceManager注册自己的可用任务槽(slots)。
    6. 资源管理器通知TaskManager为新的作业提供slots。
    7. TaskManager连接到对应的JobMaster,提供slots。
    8. JobMaster将需要执行的任务分发给TaskManager。
    9. TaskManager执行任务,互相之间可以交换数据。

    如果部署模式不同,或者集群环境不同(例如Standalone、YARN、K8S等),其中一些步骤可能会不同或被省略,也可能有些组件会运行在同一个JVM进程中。比如:独立集群环境的会话模式,就是需要先启动集群,如果资源不够,只能等待资源释放,而不会直接启动新的TaskManager。

    作者:Ya
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Redis 数据结构之dict
    分布式一致性算法——paxos
    分布式事务、两阶段提交协议、三阶提交协议
    MySQL主从数据同步延时分析
    MySQL数据丢失情况分析
    INSERT ... ON DUPLICATE KEY UPDATE Syntax
    分布式系统的数据一致性
    分布式系统的BASE理论
    分布式系统的CAP理论
    性能指标体系构建
  • 原文地址:https://www.cnblogs.com/1463490Ya/p/15673981.html
Copyright © 2020-2023  润新知