Flink - 运行时架构

suaxi
2026-11-02 / 0 评论 / 3 阅读 / 正在检测是否收录...

三、运行时架构

1. 系统架构

3.1系统架构.png


(1)JobManager 作业管理器

概念:Flink 集群中任务管理、调度的核心,控制应用执行的主进程,即:每个任务都应该被唯一的 JobManager 控制执行。

包含以下3个组件:

  • JobMaster

    负责处理单独的作业(Job),它与具体的作业是一一对应的。当作业提交时,JobMaster 会先接收要执行的应用,将其转换为 StreamGraph 后,再转换为 JobGraph(ExecutionGraph 执行图),其包含了所有所有可以并发执行的任务,之后 JobMaster 向资源管理器(ResourceManager)申请执行任务所需的资源(Slot),并将执行图分发到执行具体任务的 TaskManager

  • ResourceManager(资源管理器)

    主要负责资源分配和管理,资源指 TaskManager 的任务槽(Task Slots),Flink 集群中的资源调配单元,包含用于执行计算的一组 CPU 和内存资源,一个任务对应一个 Slot

  • Dispatcher(分发器)

    提供 REST 接口和 Web UI 管理界面,用于提交应用,并且为每一个新提交的作业启动一个新的 JobMaster 组件,该组件随部署模式的不同而不同


(2)TaskManager 任务管理器

任务管理器是 Flink 的工作进程,负责计算数据流(执行具体的作业),每个任务管理器都包含一定数量的 Task Slot,Slot 是资源调度的最小单位,其数量决定了任务管理器能并行处理的任务数。不同 TaskManager 之间可以进行数据交换。


2. 核心概念

2.1 并行度(Parallelism)

(1)并行子任务和并行度

当需要处理的数据量很大时,我们可以把一个算子操作,“复制”到多个节点,数据来了之后可以在其中任一节点执行,这样一个算子任务就被拆分成了多个并行的子任务(SubTask),再将它们分发到不同的节点,就真正实现了并行计算。

在 Flink 执行过程中,一个算子(operator)可以包含一个或多个子任务,这些子任务在不同线程、不同物理机或不同容器中完全独立的执行。

3.2.1.1并行子任务和并行度.png

算子的子任务个数成为并行度(Parallelism),包含并行子任务的数据流称为并行数据流,它需要多个分区(Stream Partition)来分配并行任务,一个算子的最大并行度成为一个流程序的并行度


(2)设置并行度

  • setParallelism() 方法:

    // 通过执行环境设置
    env.setParallelism(2);
    
    // 设置当前算子的并行度
    stream
        .map(word -> Tuple2.of(word, 1L))
        .setParallelism(2);
  • 在 web ui 或命令行提交应用时设置

    • 命令行

      # -p 指定算子并行度
      bin/flink run –p 2 –c [fullyQualifiedClassName] xxx.jar
    • web ui

      3.2.1.2设置并行度

    • conf 配置文件

      # flink-conf.yaml
      # 默认值为 1
      parallelism.default: 1


2.2 算子链(Operator Chain)

3.2.1.1并行子任务和并行度.png

(1)算子间的数据传输

  • 一对一(One to One, forwarding)

    该模式下数据流维护分区以及元素的顺序,即 source ---> map,source 读取完数据后可以直接发送给 map 继续处理,它们之间不需要重分区,也不用调整执行顺序,map 算子的子任务看到的元素个数和顺序与 source 算子的子任务产生的完全一样,遵循“一对一”的关系

  • 重分区(Redistricting)

    该模式下的数据流分区会发生改变,如图中 map 算子之后的 keyBy/window 等算子, keyBy/window 算子与 sink 算子之间的数据流向,每个算子的子任务会根据数据传输策略,将数据发送到不同的下游目标任务,在这个过程中会发生数据重分区


(2)合并算子链

在 Flink 中,并行度相同的一对一算子操作,可以直接连接在一起形成一个大的任务,称为算子链(Operator Chain),可以减少线程上下文切换和基于缓冲区的数据交换,减少延时,提升吞吐量

3.2.2合并算子链.png

上图中 source 和 map满足算子链的要求,可以直接合并形成一个任务(并行度相同),合并之后为两个并行子任务,最终这个作业有5个任务,由5个线程并行执行

注:Flink 顶层会自动优化可合并的算子链,在业务场景需要禁用某些算子的合并操作时,可在具体的算子后通过 .disableChaining() 方法禁用

0

评论 (0)

取消