Flink篇——1.运行架构

Flink运行架构

    • 一.运行组件
        • 1.JobMnanager
        • 2.ResourceManager
        • 3.TaskManager
        • 4.Dispatcher
    • 二.提交流程(以 YARN 方式举例)
    • 三.任务调度原理
      • 1.TaskManager与Slots
      • 2.程序与数据流(dataflows)

一.运行组件

主要包含以下四个
JobMnanager
ResourceManager
TaskManager
Dispatchaer

其中Flink的是基于Java实现的,因此均运行在Java虚拟机上。

1.JobMnanager

其是一个应用程序执行的主进程。
JobManager 会先接收到要执行的应用程序, 这个应用程序会包括:作业图(JobGraph) 、 逻辑数据流图(logical dataflow graph) 和打包了所有的类、 库和其它资源的 JAR 包。

JobManager 会把 JobGraph 转换成一个物理层面的数据流图, 这个图被叫做“执行图” (ExecutionGraph) , 包含了所有可以并发执行的任务。 JobManager会向ResourceManager请求执行任务必要的资源, 也就是TaskManager上的slot。 一旦它获取到了足够的资源, 就会将执行图分发到真正运行它们的TaskManager 上。 而在运行过程中, JobManager 会负责所有需要中央协调的操作, 比如说checkpoints 的协调。

2.ResourceManager

其主要管理TaskManager的slot

TaskManger 的slot是 Flink 中定义的处理资源单元。当 JobManager 申请slot资源时,ResourceManager会将有空闲slot的 TaskManager 分配给 JobManager。 如果ResourceManager 没有足够的slot来满足 JobManager 的请求, 它还可以向资源提供平台发起会话, 以提供启动 TaskManager进程的容器。 另外, ResourceManager 还负责终止空闲的 TaskManager, 释放计算资源。

3.TaskManager

Flink 中的工作进程。

通常在Flink 中会有多个 TaskManager 运行, 每一个 TaskManager都包含了一定数量的slots ,它的数量又限制了 TaskManager 能够执行的任务数量。

启动之后, TaskManager 会向ResourceManager注册它的slots ,在收到ResourceManager的指令后,
TaskManager 就会将一个或者多个slots提供给 JobManager 调用。 JobManager 就可以向插槽
分配tasks 执行了。 在执行过程中, 一个 TaskManager 可以跟其它运行同一应用程
序的 TaskManager 交换数据。

4.Dispatcher

其为应用提交提供了 REST 接口。

当一个应用被提交执行时, Dispatcher就会启动并将应用移交给一个 JobManager。 由于是 REST 接口, 所以 Dispatcher 可以作为集群的一个 HTTP 接入点, 这样就能够不受防火墙阻挡。 Dispatcher 也会启动一个 Web UI, 用来方便地展示和监控作业执行的信息。 Dispatcher 在架构中可能并不是必需的, 这取决于应用提交运行的方式。

二.提交流程(以 YARN 方式举例)

Flink篇——1.运行架构_第1张图片

  • Flink 任 务 提 交 后 , Client 向 HDFS 上 传 Flink 的 Jar 包 和 配 置
  • 向 Yarn上的ResourceManager 提 交 任 务 , ResourceManager 分 配 Container 资 源 并 通 知 对 应 的NodeManager 启动 ApplicationMaster
  • ApplicationMaster 启动后加载 Flink 的 Jar 包和配置构建环境, 然后启动 JobManager
  • ApplicationMaster 向 ResourceManager申 请 资 源 启 动 TaskManager , ResourceManager 分 配 Container资源后, 由ApplicationMaster 通 知 资 源 所 在 节 点 的 NodeManager 启 动 TaskManager
  • NodeManager 加载 Flink 的 Jar 包和配置构建环境并启动 TaskManager, TaskManager启动后向 JobManager 发送心跳包, 并等待 JobManager 向其分配任务。

三.任务调度原理

Flink篇——1.运行架构_第2张图片

  • 客户端不是运行时和程序执行的一部分,但它用于准备并发送dataflow(JobGraph)给 Master(JobManager), 然后, 客户端断开连接或者维持连接以等待接收计算结果。
  • 当Flink集群启动后,首先会启动一个JobManger和一个或多个的TaskManager。由 Client 提交任务给 JobManager,JobManager 再调度任务到各个TaskManager 去执行
  • TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。 上述三者均为独立的 JVM 进程。
    Client 为提交 Job 的客户端, 可以是运行在任何机器上( 与 JobManager 环境
    连通即可) 。 提交 Job 后, Client 可以结束进程( Streaming 的任务) , 也可以不
    结束并等待结果返回。
  • JobManager主要负责调度Job并协调Task做checkpoint。从Client处接收到 Job 和 JAR 包等资源后, 会生成优化后的执行计划, 并以 Task 的单元调度到各个 TaskManager 去执行。
  • TaskManager 在启动的时候就设置好了Slots,每个 slot 能启动一个Task,Task 为线程。从JobManager 处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。

1.TaskManager与Slots

Flink中每一个worker(TaskManager)都是一个JVM进程,它可能会在独立的线程上执行一个或多个subtask。为了控制一个worker能接收多少个task,worker通过task slot来进行控制。

  • task slot表示TaskManager资源的固定集,并且其管理的内存将会等分给各个slot。避免了subtask的内存竞争。
  • 在TaskManager中,若只有一个slot,则每个task group将运行在独立的JVM中,而多个slot意味着更多的subtask共享同一个JVM、TCP连接和心跳消息;也可能共享数据集和数据结构,能有效减少每个task的负载。
    Flink篇——1.运行架构_第3张图片
    Flink篇——1.运行架构_第4张图片默认情况下,Flink允许子任务共享slot,即使它们是不同任务的子任务(前提是它们来自同一个job),这样的话,一个slot可以保存作业的整个管道。
  • Task Slot是静态的概念,是指TaskManager具有的并发执行能力;而并行度parallelism是动态概念,即TaskManager运行程序时实际使用的并发能力。

举个例子:

  • 假设一共有3个TaskManager,每一个TaskManager中的分配3个TaskSlot,也就是每个TaskManager可以接收3个task,一共9个TaskSlot。
    如果我们设置 parallelism.default=1,即运行程序默认的并行度为1,9个TaskSlot只用了1个而有8个空闲,因此,设置合适的并行度才能提高效率。

2.程序与数据流(dataflows)

Flink篇——1.运行架构_第5张图片

所有的 Flink 程序都是由三部分组成的: Source 、 Transformation 和 Sink。Source 负责读取数据源, Transformation 利用各种算子进行处理加工, Sink 负责输出。

  • 运行时,Flink上的程序会被映射成数据流,包含以上三个部分。
  • 每个dataflow都以N个sources开始,N个sinks结束。
  • dataflow类似于任意的有向无环图(DAG),大部分情况下,程序的transformations和dataflow中的operator是一一对应的关系。(一个 transformation 也可能对应多个 operator)

未完待续。。。。。。

你可能感兴趣的:(Flink,flink,大数据)