Flink_运行架构

4.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 向其分配任务。

4.2 Worker 与 Slots

每一个 worker(TaskManager)是一个 JVM 进程,它可能会在独立的线程上执行一个或 多个 subtask。为了控制一个 worker 能接收多少个 task,worker 通过 task slot 来进 行控制(一个 worker 至少有一个 task slot)。
每个 task slot 表示 TaskManager 拥有资源的一个固定大小的子集。假如一个 TaskManager 有三个 slot,那么它会将其管理的内存分成三份给各个 slot。资源 slot 化 意味着一个 subtask 将不需要跟来自其他 job 的 subtask 竞争被管理的内存,取而代之 的是它将拥有一定数量的内存 储备。需要注意的是,这里不会涉及到 CPU 的隔离,slot 目 前仅仅用来隔离 task 的受管理的内存。
通过调整 task slot 的数量,允许用户定义 subtask 之间如何互相隔离。如果一个 TaskManager 一个 slot,那将意味着每个 task group 运行在独立的 JVM 中(该 JVM 可 能是通过一个特定的容器启动的),而一个 TaskManager 多个 slot 意味着更多的 subtask 可以共享同一 个 JVM。而在同一个 JVM 进程中的 task 将共享 TCP 连接(基于多路复用) 和心跳消息。它们也可能共享数据集和数据结构,因此这减少了每个 task 的负载。
在这里插入图片描述
Task Slot 是静态的概念,是指 TaskManager 具有的并发执行能力,可以通过参数 taskmanager.numberOfTaskSlots 进行配置,而并行度 parallelism 是动态概念,即 TaskManager 运行程序时实际使用的并发能力,可以通过参数 parallelism.default 进行 配置。也就是说,假设一共有 3 个 TaskManager,每一个 TaskManager 中的分配 3 个 TaskSlot,也 就 是 每 个 TaskManager 可 以 接 收 3 个 task , 一 共 9 个 TaskSlot , 如 果 我 们 设 置 parallelism.default=1,即运行程序默认的并行度为 1, 9 个 TaskSlot 只用了 1 个,有 8 个空 闲,因此,设置合适的并行度才能提高效率。

4.3 程序与数据流

Flink 程序的基础构建模块是 流(streams) 与 转换(transformations)(需要注意 的是,Flink 的 DataSet API 所使用的 DataSets 其内部也是 stream)。一个 stream 可 以看成一个中间 结果,而一个 transformations 是以一个或多个 stream 作为输入的某种 operation,该 operation 利用这些 stream 进行计算从而产生一个或多个 result stream。
在运行时,Flink 上运行的程序会被映射成 streaming dataflows,它包含了 streams 和 transformations operators。每一个 dataflow 以一个或多个 sources 开始以一个或 多个 sinks 结束。dataflow 类似于任意的有向无环图(DAG),当然特定形式的环可以通过 iteration 构建。 在大部分情况下,程序中的 transformations 跟 dataflow 中的 operator 是一一对应的关系,但 有时候,一个 transformation 可能对应多个 operator。
在这里插入图片描述

4.4 并行数据流

Flink 程序的执行具有并行、分布式的特性。在执行过程中,一个 stream 包含一个或 多个 stream partition ,而每一个 operator 包含一个或多个 operator subtask,这些 operator subtasks 在不同的线程、不同的物理机或不同的容器中彼此互不依赖得执行。
一个特定 operator 的 subtask 的个数被称之为其 parallelism(并行度)。一个 stream 的并行度总是等同于其 producing operator 的并行度。一个程序中,不同的 operator 可能具有不同的并行度。
在这里插入图片描述
Stream 在 operator 之间传输数据的形式可以是 one-to-one(forwarding)的模式也 可以是 redistributing 的模式,具体是哪一种形式,取决于 operator 的种类。 One-to-one:stream(比如在 source 和 map operator 之间)维护着分区以及元素的顺
序。那意味着 map operator 的 subtask 看到的元素的个数以及顺序跟 source operator 的 subtask 生产的元素的个数、顺序相同,map、fliter、flatMap 等算子都是 one-to-one 的对应关系。 Redistributing:stream(map()跟 keyBy/window 之间或者 keyBy/window 跟 sink 之 间)的分 区会发生改变。每一个 operator subtask 依据所选择的 transformation 发送数 据到不同的目标 subtask。例如,keyBy() 基于 hashCode 重分区、broadcast 和 rebalance 会随机重新分区,这 些算子都会引起 redistribute 过程,而 redistribute 过程就类似 于 Spark 中的 shuffle 过程。

4.5 task 与 operator chains

出于分布式执行的目的,Flink 将 operator 的 subtask 链接在一起形成 task,每个 task 在 一个线程中执行。将 operators 链接成 task 是非常有效的优化:它能减少线程之 间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量。链接的行为可以在编程 API 中进行指定。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44509920/article/details/107193068