天天看点

Flink整体架构原理、组件角色介绍、并行度概念和调整优先级

Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序

运行时由两种类型的进程组成

  1. 一个 JobManager
  2. 一个或者多个 TaskManager

任务提交流程图如下:

Flink整体架构原理、组件角色介绍、并行度概念和调整优先级

什么是JobManager

可以理解为一个厂长,协调 Flink 应用程序的分布式执行的功能

  • 它决定何时调度下一个 task(或一组 task)
  • 对完成的 task 或执行失败做出反应
  • 协调 checkpoint、并且协调从失败中恢复等等

JobManager进程由三个不同的组件组成

  1. ResourceManager

    负责 Flink 集群中的资源提供、回收、分配 管理 task slots

  2. Dispatcher

    提供了一个 REST 接口,用来提交 Flink 应用程序执行

    为每个提交的作业启动一个新的 JobMaster

    运行 Flink WebUI 用来提供作业执行信息

  3. JobMaster

    负责管理单个JobGraph的执行,Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster

    注:

    至少有一个 JobManager,高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby

什么是TaskManager

可以理解为车间组长

  • 负责计算的worker,还有上报内存、任务运行情况给JobManager等
  • 至少有一个 TaskManager,也称为 worker执行作业流的 task,并且缓存和交换数据流
  • 在 TaskManager 中资源调度的最小单位是 task slot

    TaskManager是由task slot组成,task slot 的数量表示并发处理 task 的数量

Task Slots 任务槽

  • Task Slot是Flink中的任务执行器,每个Task Slot可以运行多个subtask ,每个subtask会以单独的线程来运行
  • 每个 worker(TaskManager)是一个 JVM 进程,可以在单独的线程中执行一个(1个solt)或多个 subtask
  • 为了控制一个 TaskManager 中接受多少个 task,就有了所谓的 task slots(至少一个)
  • 每个 task slot 代表 TaskManager 中资源的固定子集
  • 注:
    • 所有Task Slot平均分配TaskManger的内存, TaskSolt 没有 CPU 隔离
    • 当前 TaskSolt 独占内存空间,作业间互不影响
    • 一个TaskManager进程里有多少个taskSolt就意味着多少个并发
    • task solt数量建议是cpu的核数,独占内存,共享CPU

一个 task slot 中可以执行多个算子

算子 opetator: source、 transformation、 sink

对于分布式执行,Flink 将算子的 subtasks 链接成 tasks,每个 task 由一个线程执行

Flink整体架构原理、组件角色介绍、并行度概念和调整优先级
Flink整体架构原理、组件角色介绍、并行度概念和调整优先级

图中有5 个 subtask 执行,因此有 5 个并行线程

  • Task 正好封装了一个 Operator 或者 Operator Chain 的 parallel instance。
  • Sub-Task 强调的是同一个 Operator 或者 Operator Chain 具有多个并行的 Task
  • source和map算子组成一个算子链,作为一个task运行在一个线程上
  • 算子链接成 一个 task 它减少线程间切换、缓冲的开销,并且减少延迟的同时增加整体吞吐量

Task Slot是Flink中的任务执行器,每个Task Slot可以运行多个task即subtask ,每个sub task会以单独的线程来运行

官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/learn-flink/overview/

Flink整体架构原理、组件角色介绍、并行度概念和调整优先级

如上图显示的Flink 算子之间可以通过【一对一】模式或【重新分发】模式传输数据

官方文档链接:

https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/concepts/flink-architecture/#tasks-and-operator-chains

https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/concepts/glossary/

Flink的并行度概念和调整优先级

Flink 是分布式流式计算框架

  • 程序在多节点并行执行,所以就有并行度 Parallelism
  • DataStream 就像是有向无环图(DAG),每一个 数据流(DataStream) 以一个或多个 source 开始,以一个或多个

    sink 结束

流程

  • 一个数据流( stream) 包含一个或多个分区,在不同的线程/物理机里并行执行
  • 每一个算子( operator) 包含一个或多个子任务( subtask),子任务在不同的线程/物理机里并行执行

    一个算子的子任务subtask 的个数就是并行度( parallelism)

Flink整体架构原理、组件角色介绍、并行度概念和调整优先级

并行度的调整配置

  • Flink流程序中不同的算子可能具有不同的并行度,可以在多个地方配置,有不同的优先级
  • Flink并行度配置级别 (高到低)

    算子

    map( xxx ).setParallelism(2)

    全局env

    env.setParallelism(2)

    客户端cli

    ./bin/flink run -p 2 xxx.jar

    Flink配置文件

    /conf/flink-conf.yaml 的 parallelism.defaul 默认值

    某些算子无法设置并行度

    本地IDEA运行 并行度默认为cpu核数

    注:

    一个很重要的区分 TaskSolt和parallelism并行度配置

    task slot是静态的概念,是指taskmanager具有的并发执行能力;

    parallelism是动态的概念,是指 程序运行时实际使用的并发能力

    前者是具有的能力比如可以100个,后者是实际使用的并发,比如只要20个并发就行。

继续阅读