Flink架构重要概念解析-超详理解

news2025/7/18 8:28:28

文章目录

    • 💎 1.1 系统架构
      • 1.1.1 整体构成
      • 1.1.2 作业管理器(JobManager)
      • 1.1.3 任务管理器(TaskManager)
    • 🚀1.2 作业提交流程
      • 1.2.1 高层级抽象视角
      • 1.2.2 独立模式(Standalone)
      • 1.2.3 YARN 集群
    • 🍔1.3 一些重要概念
      • 1.3.1 数据流图(Dataflow Graph)
      • 1.3.2 并行度(Parallelism)
      • 1.3.3 算子链(Operator Chain)
      • 1.3.4 作业图(JobGraph)与执行图(ExecutionGraph)
      • 1.3.5 任务(Tasks)和任务槽(Task Slots)

#

😃😃😃😃😃

githubgithubgithubgithubgithubgithubgithubgithubgithubgithubgithubgithubgithub

更多资源链接,欢迎访问作者gitee仓库:https://gitee.com/fanggaolei/learning-notes-warehouse/tree/master

💎 1.1 系统架构

三大部分 四个组件 四张图

image-20221115160643884

1.1.1 整体构成

image-20221114134455380

  这里首先要说明一下“客户端”。其实客户端并不是处理系统的一部分,它只负责作业的提交。具体来说,就是调用程序的 main 方法,将代码转换成“数据流图”(Dataflow Graph),并最终生成作业图(JobGraph),一并发送给 JobManager。 提交之后,任务的执行其实就跟客户端没有关系了;我们可以在客户端选择断开与 JobManager 的连接, 也可以继续保持连接。之前我们在命令提交作业时,加上的-d 参数,就是表示分离模式(detached mode),也就是断开连接。

  当然,客户端可以随时连接到 JobManager,获取当前作业的状态和执行结果,也可以发送请求取消作业。我们在上一章中不论通过 Web UI 还是命令行执行“flink run”的相关操作,都是通过客户端实现的。

  Flink 的运行时架构中,最重要的就是两大组件:作业管理器(JobManger)和任务管理器(TaskManager)。 对于一个提交执行的作业,JobManager 是真正意义上的“管理者”(Master),负责管理调度,所以在不考虑高可用的情况下只能有一个;而 TaskManager 是“工作者”(Worker、Slave),负责执行任务处理数据,所以可以有一个或多个。

1.1.2 作业管理器(JobManager)

1.JobMaster

​   JobMaster 是 JobManager 中最核心的组件,负责处理单独的作业(Job)。所以 JobMaster和具体的 Job 是一一对应的,多个 Job 可以同时运行在一个 Flink 集群中, 每个 Job 都有一个自己的 JobMaster。需要注意在早期版本的 Flink 中,没有 JobMaster 的概念;而 JobManager的概念范围较小,实际指的就是现在所说的 JobMaster。

​   在作业提交时,JobMaster 会先接收到要执行的应用。这里所说“应用”一般是客户端提交来的,包括:Jar 包,数据流图(dataflow graph),和作业图(JobGraph)。JobMaster 会把 JobGraph 转换成一个物理层面的数据流图,这个图被叫作“执行图”(ExecutionGraph),它包含了所有可以并发执行的任务。

​   JobMaster 会向资源管理器(ResourceManager)发出请求,申请执行任务必要的资源。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的 TaskManager 上。

​ 而在运行过程中,JobMaster 会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

2.资源管理器(ResourceManager)

​   ResourceManager 主要负责资源的分配和管理,在 Flink 集群中只有一个。所谓“资源”,主要是指 TaskManager 的任务槽(task slots)。任务槽就是 Flink 集群中的资源调配单元,包含了机器用来执行计算的一组 CPU 和内存资源。每一个任务(Task)都需要分配到一个 slot 上执行。

​   这里注意要把 Flink 内置的 ResourceManager 和其他资源管理平台(比如 YARN)的ResourceManager 区分开。

​   Flink 的 ResourceManager,针对不同的环境和资源管理平台(比如 Standalone 部署,或者YARN),有不同的具体实现。在 Standalone 部署时,因为 TaskManager 是单独启动的(没有Per-Job 模式),所以 ResourceManager 只能分发可用 TaskManager 的任务槽,不能单独启动新TaskManager。

​   而在有资源管理平台时,就不受此限制。当新的作业申请资源时,ResourceManager 会将有空闲槽位的 TaskManager 分配给 JobMaster。如果 ResourceManager 没有足够的任务槽,它还可以向资源提供平台发起会话,请求提供启动 TaskManager 进程的容器。另外,ResourceManager 还负责停掉空闲的 TaskManager,释放计算资源。

3.分发器(Dispatcher)

​   Dispatcher 主要负责提供一个 REST 接口,用来提交应用,并且负责为每一个新提交的作业启动一个新的 JobMaster 组件。Dispatcher 也会启动一个 Web UI,用来方便地展示和监控作业执行的信息。Dispatcher 在架构中并不是必需的,在不同的部署模式下可能会被忽略掉。

1.1.3 任务管理器(TaskManager)

​   TaskManager 是 Flink 中的工作进程,数据流的具体计算就是它来做的,所以也被称为“Worker”。Flink 集群中必须至少有一个 TaskManager;当然由于分布式计算的考虑,通常会有多个 TaskManager 运行,每一个 TaskManager 都包含了一定数量的任务槽(task slots)。 Slot是资源调度的最小单位,slot 的数量限制了 TaskManager 能够并行处理的任务数量。启动之后,TaskManager 会向资源管理器注册它的 slots;收到资源管理器的指令后,TaskManager 就会将一个或者多个槽位提供给 JobMaster 调用,JobMaster 就可以分配任务来执行了。在执行过程中,TaskManager 可以缓冲数据,还可以跟其他运行同一应用的 TaskManager交换数据。

🚀1.2 作业提交流程

1.2.1 高层级抽象视角

image-20221115133903731

(1) 一般情况下,由客户端(App)通过分发器提供的 REST 接口,将作业提交给JobManager。

(2)由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。

(3)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)。

(4)资源管理器判断当前是否由足够的可用资源;如果没有,启动新的 TaskManager。

(5)TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots)。

(6)资源管理器通知 TaskManager 为新的作业提供 slots。

(7)TaskManager 连接到对应的 JobMaster,提供 slots。

(8)JobMaster 将需要执行的任务分发给 TaskManager。

(9)TaskManager 执行任务,互相之间可以交换数据。

​ 如果部署模式不同,或者集群环境不同(例如 Standalone、YARN、K8S 等),其中一些步骤可能会不同或被省略,也可能有些组件会运行在同一个 JVM 进程中。比如我们在上一章实践过的独立集群环境的会话模式,就是需要先启动集群,如果资源不够,只能等待资源释放,而不会直接启动新的 TaskManager。接下来我们就具体介绍一下不同部署环境下的提交流程。

1.2.2 独立模式(Standalone)

image-20221115134123876

(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,执行任务。
可见,整个流程除了请求资源时要“上报”YARN 的资源管理器,其他与 4.2.1 节所述抽象流程几乎完全一样。

1.2.3 YARN 集群

会话模式:

image-20221115134246908

单作业模式:

image-20221115134135670

(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,之后的流程就与会话模式完全一样了。

🍔1.3 一些重要概念

1.3.1 数据流图(Dataflow Graph)

  所有的 Flink 程序都可以归纳为由三部分构成:Source、Transformation 和 Sink。

⚫ Source 表示“源算子”,负责读取数据源。

⚫ Transformation 表示“转换算子”,利用各种算子进行处理加工。

⚫ Sink 表示“下沉算子”,负责数据的输出。

image-20221115142636901

1.3.2 并行度(Parallelism)

image-20221115140909206

​   当前数据流中有 source、map、window、sink 四个算子,除最后 sink,其他算子的并行度都为 2。整个程序包含了 7 个子任务,至少需要 2 个分区来并行执行。我们可以说,这段流处理程序的并行度就是 2

1.3.3 算子链(Operator Chain)

  在 Flink 中,并行度相同的一对一(one to one)算子操作,可以直接链接在一起形成一个“大”的任务(task),这样原来的算子就成为了真正任务里的一部分,如图 4-11 所示。每个 task会被一个线程执行。这样的技术被称为“算子链”(Operator Chain)。

image-20221115142036619

合并算子链

image-20221115142128151

​   Source 和 map 之间满足了算子链的要求,所以可以直接合并在一起,形成了一个任务;因为并行度为 2,所以合并后的任务也有两个并行子任务。这样,这个数据流图所表示的作业最终会有 5 个任务,由 5 个线程并行执行。

Flink 为什么要有算子链这样一个设计呢?

​   这是因为将算子链接成 task 是非常有效的优化:可以减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量。

1.3.4 作业图(JobGraph)与执行图(ExecutionGraph)

image-20221115161020657

image-20221115161033765

1.逻辑流图(StreamGraph)

​   这是根据用户通过 DataStream API 编写的代码生成的最初的 DAG 图,用来表示程序的拓扑结构。这一步一般在客户端完成。

我们可以看到,逻辑流图中的节点,完全对应着代码中的四步算子操作:

源算子 Source(socketTextStream())→扁平映射算子 Flat Map(flatMap()) →分组聚合算子

Keyed Aggregation(keyBy/sum()) →输出算子 Sink(print())。

2.作业图(JobGraph)

​   StreamGraph 经过优化后生成的就是作业图(JobGraph),这是提交给 JobManager 的数据结构,确定了当前作业中所有任务的划分。主要的优化为:将多个符合条件的节点链接在一起合并成一个任务节点,形成算子链,这样可以减少数据交换的消耗。JobGraph 一般也是在客户端生成的,在作业提交时传递给 JobMaster。

​   分组聚合算子(Keyed Aggregation)和输出算子 Sink(print)并行度都为 2,而且是一对一的关系,满足算子链的要求,所以会合并在一起,成为一个任务节点。

3.执行图(ExecutionGraph)

​   JobMaster 收到 JobGraph 后,会根据它来生成执行图(ExecutionGraph)。ExecutionGraph是 JobGraph 的并行化版本,是调度层最核心的数据结构。

​   从图 4-12 中可以看到,与 JobGraph 最大的区别就是按照并行度对并行子任务进行了拆分,并明确了任务间数据传输的方式。

4.物理图(Physical Graph)

​   JobMaster 生成执行图后, 会将它分发给 TaskManager;各个 TaskManager 会根据执行图部署任务,最终的物理执行过程也会形成一张“图”,一般就叫作物理图(Physical Graph)。这只是具体执行层面的图,并不是一个具体的数据结构。

​   物理图主要就是在执行图的基础上,进一步确定数据存放的位置和收发的具体方式。有了物理图,TaskManager 就可以对传递来的数据进行处理计算了。

​   所以我们可以看到,程序里定义了四个算子操作:源(Source)->转换(flatMap)->分组聚合(keyBy/sum)->输出(print);合并算子链进行优化之后,就只有三个任务节点了;再考虑并行度后,一共有 5 个并行子任务,最终需要 5 个线程来执行。

1.3.5 任务(Tasks)和任务槽(Task Slots)

1.任务槽

​   之前已经提到过,Flink 中每一个 worker(也就是 TaskManager)都是一个 JVM 进程,它可以启动多个独立的线程,来并行执行多个子任务(subtask)。

​   所以如果想要执行 5 个任务,并不一定非要 5 个 TaskManager,我们可以让 TaskManager多线程执行任务。如果可以同时运行 5 个线程,那么只要一个 TaskManager 就可以满足我们之前程序的运行需求了。

​   很显然,TaskManager 的计算资源是有限的,并不是所有任务都可以放在一个 TaskManager上并行执行。并行的任务越多,每个线程的资源就会越少。那一个 TaskManager 到底能并行处理多少个任务呢?为了控制并发量,我们需要在 TaskManager 上对每个任务运行所占用的资源做出明确的划分,这就是所谓的任务槽(task slots)。

image-20221115142553751

2.任务对任务槽的共享

​   我们可以基于之前的例子继续扩展。如果我们保持 sink 任务并行度为 1 不变,而作业提交时设置全局并行度为 6,那么前两个任务节点就会各自有 6 个并行子任务,整个流处理程序则有 13 个子任务。那对于 2 个 TaskManager、每个有 3 个 slot 的集群配置来说,还能否正常运行呢?

image-20221115162158021

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

​   Slot 和并行度确实都跟程序的并行执行有关,但两者是完全不同的概念。简单来说,task slot 是 静 态 的 概 念 , 是 指 TaskManager 具 有 的 并 发 执 行 能 力, 可 以 通 过 参 数taskmanager.numberOfTaskSlots 进行配置;而并行度(parallelism)是动态概念,也就是TaskManager 运行程序时实际使用的并发能力,可以通过参数 parallelism.default 进行配置。换句话说,并行度如果小于等于集群中可用 slot 的总数,程序是可以正常执行的,因为 slot 不一定要全部占用,有十分力气可以只用八分;而如果并行度大于可用 slot 总数,导致超出了并行能力上限,那么心有余力不足,程序就只好等待资源管理器分配更多的资源了。

image-20221115162521689

image-20221115162536373

image-20221115162548638

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网页数据采集系统-怎样利用爬虫爬网站数据

随着社会不停地发展。人们也是越来越离不开互联网,今天小编就给大家盘点一下免费的网页数据采集系统,只需要点几下鼠标就能轻松爬取数据,不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四! 企业人员 通过爬…

【直播预告】相机模型与标定——Real world超级公开课

导言 《Realworld超级公开课》是奥比中光3D视觉开发者社区打造的品牌活动之一,聚焦于3D视觉传感技术。每期课程邀请奥比中光及生态合作伙伴的技术专家,以线上线下相结合的授课形式,面向高校与人工智能企业的开发者,分享3D视觉技术…

线程的“结束”

【一道概率很高的面试题】: 如何优雅的结束一个线程? 上传一个大文件,正在处理费时的计算,如何优雅的结束这个线程呢? 【stop方法】: 【为何不建议使用stop呢?】: 因为很容易产生…

【附源码】计算机毕业设计JAVA成绩分析系统

【附源码】计算机毕业设计JAVA成绩分析系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

ORA-01940 无法删除当前已连接的用户之解决方案(脚本)

第一部分:配置数据库连接 1. 安装ODBC yum -y install unixODBC unixODBC-devel 2. 安装Oracle-instantclient #以下所有操作使用root账号执行 #创建目录 mkdir -p /opt/oracle cd /opt/oracle #下载odbc安装包 wget https://download.oracle.com/otn_software…

计算机毕业设计ssm+vue基本微信小程序的好物推荐分享系统

项目介绍 我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,好物分享系统小程序被用户普遍使用,为方便用户能够可以随时进行好物分享系统小程序的数据信息管理,特开发了基于好物分…

做食品能入驻Lazada吗?带你解锁东南亚当地热销及需求食品系列

中国的电商领域已经趋于饱和状态,中国食品电商领域已经呈现出存量的趋势了,例如:良品铺子、三只松鼠、百草味、口水娃、盼盼等国内知名品牌已经占比了国内大部分的市场份额,跟着巨头抢市场 无疑是很难的,那么中国这么多…

红外线热像仪的热成像质量介绍

摘要 毫无疑问,你在过去几年的某个时候,购买了数位相机来更换旧的胶卷相机。你的购买可能受到你的信念的影响,即在尝试判断提供的所有相机选择之间的图像质量时,像素数是最重要的规格。 任何阅读过消费者报告及其对数位相机的详…

CVE-2020-1472-ZeroLogon复现

CVE-2020-1472-ZeroLogon复现 简介 Netlogon使用的AES认证算法中的vi向量默认为0,导致攻击者可以绕过认证,同时其设置域控密码的远 程接口也使用了该函数,导致可以将域控中保存在AD中的管理员password设置为空 影响版本 Windows Server 2…

大牛耗时两年完成的实战手册。Elasticsearch实战,掌握这些刚刚好!

记得刚接触Elasticsearch的时候,没找啥资料,直接看了遍Elasticsearch的中文官方文档,中文文档很久没更新了,一直都是2.3的版本。最近又重新看了遍6.0的官方文档,由于官方文档介绍的内容比较多,每次看都很费…

10.基础备份与时间点恢复

目录 基础备份 时间点恢复 时间线 基础备份与时间线都是为了时间点恢复。 基础备份 基础备份的目的是备份当前的数据库集簇的快照,结合归档日志一起可以恢复至任意的时间点。 基础备份通过pg_start_backup命令开始为基础备份做准备,它会: 强制进行整…

[附源码]java毕业设计基于web的停车收费管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

dot net 杂谈之一

文章目录一、使用vscode开发.net core程序二、创建解决方案三、反射3.1 反射应用场景一3.2 反射应用场景二一、使用vscode开发.net core程序 安装如下插件: 1、vscode-solution-explorer 2、.NET Core Extension Pack 3、搜索nuget工具包并安装 二、创建解决方案…

股票l2数据接口中的逐单跟逐笔是什么意思?

股票l2数据接口中的逐单跟逐笔是什么意思? 【逐单统计】是按成交委托单资金流转情况来统计,特大资金买卖差大单资金买卖差中单资金买卖差小单资金买卖差0。是双向统计,对于每单交易同时统计买卖双方,一定程度上反应了资金在不同类…

Redis+AOP实现一个可通用的分布式锁——改进

目录前言方案改进思考与总结前言 上一次利用Redis分布式锁解决了一个并发问题: 上篇:利用Redis分布式锁解决集群服务器定时任务重复执行问题 代码可以直接从上篇文章中拿到,本篇文章仅对上次文章内容做进一步改进 主要思想是:利…

一篇读懂|Linux系统平均负载

我们经常会使用 top 命令来查看系统的性能情况,在 top 命令的第一行可以看到 load average 这个数据,如下图所示: load average 包含 3 列,分别表示 1 分钟、5 分钟和 15 分钟的 系统平均负载。 对于系统平均负载这个数值&#x…

红杉官网已删长文:伴随SBF一路走来的救世主情结(上)

每个创业公司都有一个创业故事。苹果是洛斯阿尔托斯车库里的两个黑客。谷歌是斯坦福大学宿舍里的两个研究生。而Alameda Research是伯克利公寓里做着加密货币交易的一个人。这个人叫山姆班克曼弗里德,朋友们都叫他SBF。然而,他所做的交易——最终催生了加…

ERP系统如何改善企业的业务?

ERP代表 "企业资源计划",指的是企业用来计划和管理日常活动的一种软件或系统,如供应链、制造、服务、财务和其他流程。ERP系统可用于自动化和简化整个企业或组织的个别活动,如会计和采购、项目管理、客户关系管理、风险管理、合规和…

springboot常用组件的集成

目录 springboot常用组件的集成 1.创建项目 2. web服务器配置 3. 配置数据库 4. 配置mybatis 5. 开启事务 6.aop配置 7. pagehelper分页 3. druid数据库连接池 4. 集成redis 编写一个controller用于测试 2.手动装配redis 1.创建项目 1.idea创建项目 创建步骤 &am…

PDF文档编辑Acrobat Pro DC

acrobat dc2022不仅可以轻松的帮助用户打开任意的PDF格式文件,还能随意的对其进行编辑、压缩、合并、剪裁、旋转。删除、分割、重新排序页面等操作。全新的统一分享体验使您能够跨桌面,移动和Web进行文档协作。共享PDF链接以查看或评论。在任何设备上的任…