Flink总结之彻底搞懂Flink架构

Flink总结之彻底搞懂Flink架构

Flink是目前最火的实时流处理框架,这次总结下关于Flink的组件和架构相关的知识,其中包括JobMaster和TaskManager的功能介绍以及作业的提交流程和调度原理,让我们开发不但知道Flink的怎么用的,更能清楚的了解Flink底层的运行逻辑,加深我们对Flink的理解。

本文参考官方文档:

一、Flink运行时组件

官方文档架构图:
image.png
翻译后的架构图:
image.png

1. 作业管理器JobManager

总结:JobManager是Flink的管理节点,用于管理TaskManager和作业调度器以及检查点协调器,实际上的管理者

JobManager是Flink实际意义上的管理者,是控制应用程序的核心,每个应用都会被JobManager管理,可以理解为HDFS当中的NameNode节点的作用,当然从官方提供的架构图来看JobManager也存在单点故障的情况,因此我们可以配置多个JobManager来实现高可用(HA),但是和NameNode一样,同一时刻只能有一个对外提供服务,另一个状态为standby(备用)节点。
:::info
JobManager 具有许多与协调 Flink 应用程序的分布式执行有关的职责:它决定何时调度下一个 task(或一组 task)、对完成的 task 或执行失败做出反应、协调 checkpoint、并且协调从失败中恢复等等。这个进程由三个不同的组件组成:
:::

1. JobMaster

JobMaster 负责管理单个JobGraph的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster。
始终至少有一个 JobManager。高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby

2. 资源管理器(ResourceManager)

ResourceManager 负责 Flink 集群中的资源提供、回收、分配 - 它管理 task slots,这是 Flink 集群中资源调度的单位。Flink 为不同的环境和资源提供者(例如 YARN、Kubernetes 和 standalone 部署)实现了对应的 ResourceManager。在 standalone 设置中,ResourceManager 只能分配可用 TaskManager 的 slots,而不能自行启动新的 TaskManager。

3. 分发器(Dispatcher)

Dispatcher 提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个提交的作业启动一个新的 JobMaster。它还运行 Flink WebUI 用来提供作业执行信息。

2. 任务管理器TaskManager

总结:TaskManager是Flink的执行节点,用于执行任务的节点,实际上的工作者

TaskManager(也称为 worker)执行作业流的 task,并且缓存和交换数据流。
必须始终至少有一个 TaskManager。在 TaskManager 中资源调度的最小单位是 task slot。TaskManager 中 task slot 的数量表示并发处理 task 的数量。请注意一个 task slot 中可以执行多个算子(请参考Tasks 和算子链)。

二、任务提交流程

流程大致都是一样的,只是在不同的资源管理中某些细节不一致

1. 独立部署

image.png

  1. 客户端通过分发器提供的 REST 接口,将作业提交给JobManager。
  2. 由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。
  3. JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)。
  4. 资源管理器通知 TaskManager 为新的作业提供 slots。
  5. TaskManager 连接到对应的 JobMaster,提供 slots。
  6. JobMaster 将需要执行的任务分发给 TaskManager。
  7. TaskManager 执行任务,互相之间可以交换数据。

2. YARN部署

1. 会话模式

此处的资源管理器和YARN资源管理器是不同的东西
image.png

  1. 客户端通过 REST 接口,将作业提交给分发器。
  2. 分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。
  3. JobMaster 向资源管理器请求资源(slots)。
  4. 资源管理器向 YARN 的资源管理器请求 container 资源。
  5. YARN 启动新的 TaskManager 容器。
  6. TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。
  7. 资源管理器通知 TaskManager 为新的作业提供 slots。
  8. TaskManager 连接到对应的 JobMaster,提供 slots。
  9. JobMaster 将需要执行的任务分发给 TaskManager,执行任务。
2. 单作业模式

image.png

  1. 客户端将作业提交给 YARN 的资源管理器,这一步中会同时将 Flink 的 Jar 包和配置上传到 HDFS,以便后续启动 Flink 相关组件的容器。
  2. YARN 的资源管理器分配 Container 资源,启动 Flink JobManager,并将作业提交给JobMaster。这里省略了 Dispatcher 组件。
  3. JobMaster 向资源管理器请求资源(slots)。
  4. 资源管理器向 YARN 的资源管理器请求 container 资源。
  5. YARN 启动新的 TaskManager 容器。
  6. TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。
  7. 资源管理器通知 TaskManager 为新的作业提供 slots。
  8. TaskManager 连接到对应的 JobMaster,提供 slots。
  9. JobMaster 将需要执行的任务分发给 TaskManager,执行任务。

可见,区别只在于 JobManager 的启动方式,以及省去了分发器。当第 2 步作业提交给JobMaster,之后的流程就与会话模式完全一样了。

3. 应用模式

和单作业模式基本一直,只是初始提交给 YARN 资源管理器的不再是具体的作业,而是整个应用。一个应用中可能包含了多个作业,这些作业都将在 Flink 集群中启动各自对应的 JobMaster。

三、相关组件内部原理

1. Tasks和算子链

总结:一个算子可以并行执行,形成并行子算子,代表这个算子的并发数,并发数小于等于可用的slot数量,算子链是相对于算子间数据传输而定的,比如下图中的source到map两个算子之间的数据交换是一对一的,因此Flink将此类称之为算子链,而Map算子和keyby算子或map算子和window算子之间数据传输并不是一对一的,就不会形成算子链。算子链就相当于Spark中的窄依赖,算子之间数据传输是一对一的

image.png

2. Task Slots 和资源

每个 worker(TaskManager)都是一个 JVM 进程,可以在单独的线程中执行一个或多个 subtask。为了控制一个 TaskManager 中接受多少个 task,就有了所谓的 task slots(至少一个)。意思就是一个TaskManager节点可以运行一个或多个Task Slot。

每个 task slot 代表 TaskManager 中资源的固定子集。例如,具有 3 个 slot 的 TaskManager,会将其托管内存 1/3 用于每个 slot。分配资源意味着 subtask 不会与其他作业的 subtask 竞争托管内存,而是具有一定数量的保留托管内存。注意此处没有 CPU 隔离;当前 slot 仅分离 task 的托管内存。
通过调整 task slot 的数量,用户可以定义 subtask 如何互相隔离。每个 TaskManager 有一个 slot,这意味着每个 task 组都在单独的 JVM 中运行(例如,可以在单独的容器中启动)。具有多个 slot 意味着更多 subtask 共享同一 JVM。同一 JVM 中的 task 共享 TCP 连接(通过多路复用)和心跳信息。它们还可以共享数据集和数据结构,从而减少了每个 task 的开销。
image.png
默认情况下,**Flink 允许 subtask 共享 slot,即便它们是不同的 task 的 subtask,只要是来自于同一作业即可。结果就是一个 slot 可以持有整个作业管道。**允许 _slot 共享_有两个主要优点:

  • Flink 集群所需的 task slot 和作业中使用的最大并行度恰好一样。无需计算程序总共包含多少个 task(具有不同并行度)。
  • 容易获得更好的资源利用。如果没有 slot 共享,非密集 subtask(source/map())将阻塞和密集型 subtask(window) 一样多的资源。通过 slot 共享,我们示例中的基本并行度从 2 增加到 6,可以充分利用分配的资源,同时确保繁重的 subtask 在 TaskManager 之间公平分配。

image.png

3. 任务槽和并行度的关系

taskslot 是 静 态 的 概 念 , 是 指 TaskManager 具 有 的 并 发 执 行 能 力 , 可 以 通 过 参 数
taskmanager.numberOfTaskSlots 进行配置;而并行度( parallelism)是动态概念,也就是
TaskManager 运行程序时实际使用的并发能力,可以通过参数 parallelism.default 进行配置。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

4935同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值