Flink部署模式及核心概念

news2024/11/26 4:57:22

一.部署模式

1.1会话模式(Session Mode)

需要先启动一个 Flink 集群,保持一个会话,所有提交的作业都会运行在此集群上,且启动时所需的资源以确定,无法更改,所以所有已提交的作业都会竞争集群中的资源。 

1.2单作业模式(Per-Job Mode) 

会为每一个作业单独启动一个集群,且作业完成或关闭后,相应的资源也会被释放

1.3应用模式(Application Mode)

前两种模式下,应用代码都是在客户端上执行的,然后再由客户端交由 JobManager,客户端需要下载依赖,再将二进制数据发送给 JobManager ,这会加重客户端所在节点的资源压力,而且会占用大量的网络带宽。

所以我们就可以直接将应用提交到 JobManager ,而不通过客户端。引用模式与单作业模式类似,只不过将应用直接交给 JboManager 执行。

二.Flink运行时架构

Standalone会话模式运行时架构图

2.1 作业管理器(JobManager)

JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。且每个应用都i一个被一个唯一的JobManager所控制执行。JobManger又包含3个不同的组件:

1、JobMaster

        是JobManager中最核心的组件,负责处理单独的作业(Job。每个Job都有一个自己的JobMaster。

2.资源管理器(ResourceManager

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

3.分发器(Dispatcher)

        主要负责提供一个REST接口,用来提交应用,并且负责为每一个新提交的作业启动一个新的JobMaster 组件

2.2 任务管理器(TaskManager

askManager是Flink中的工作进程,数据流的具体计算就是它来做的。每一个TaskManager都包含了一定数量的任务槽(task slots)。Slot是资源调度的最小单位,slot的数量限制了TaskManager能够并行处理的任务数量

三.核心概念

3.1 并行度(Parallelism

3.1.1 并行子任务和并行度

算子其实就是对流的操作,例如FlatMap、Sum等。

当需要处理的数据非常大时,我们可以将一个算子操作复制到多个节点执行,这样一个算子任务就被拆分成了多个“子任务(subtasks)”,再将它们分发到不同节点,就真正实现了并行计算。换句话来说就是一个算子操作不止一个人在干活,几个人干活就对应并行度。

 Flink定义一个流程序的并行度,可以认为就是其所有算子中最大的并行度

3.1.2 并行度的设置

在 Flink 中,有不同的方式来设置并行度,且他们的优先级也有区别。

1.代码中设置

        可以直接在算子后调用 setParallelism() 方法来设置当前算子的并行度。

stream.map(word -> Tuple2.of(word, 1L)).setParallelism(2);

         也可以在创建执行环境时设定全局并行度。

env.setParallelism(2);

2.提交应用时设置

  • 在使用 Flink run 命令在命令行提交任务时,可使用 -p 来指定当前应用程序执行的并行度。
  • 在WebUI中提交任务时,手动指定并行度。
  • 在 Flink的 flink-conf.yaml 配置文件下的参数 parallelism.default 可配置默认并行度。

3.2 算子链(Operator Chain)

3.2.2 算子间的数据传输

        一个数据流在算子之间传输数据的形式可以是一对一(one-to-one)的直通(forwarding)模式,也可以是打乱的重分区(redistributing)模式,具体是哪一种形式,取决于算子的种类。

  • 一对一(One-to-one,forwarding)

        在这种模式下,数据流还是保持着原来的分区和顺序,例如Source算子读取数据后,直接交给Map算子,它们之间不需要重新分区,也不需要调整顺序,这种就被称为“一对一”。例如 mapfilterflatMap等算子都是这种one-to-one的对应关系。

重分区(Redistributing)

        在这种模式下,数据流的分区或顺序会发生变化,例如使用了 KeyBy算子。

3.2.3 合并算子链

在 Flink 中,并行度相同且为一对一的算子操作,可以直接合并为一个大的任务(Task),这样原来的算子就成为了真正任务里的一部分,每个task会被一个线程执行。这样的技术被称为“算子链”(Operator Chain)。

例如有以下操作:

Source -> Map -> keyBy -> Sink

假设所有算子并行度为 2 ,由于 Source 和 Map 满足了算子链的要求( 并行度相同且为一对一 ,则可以进行合并算子链。合并算子链后, Source 的一个子任务则会和 Map 的一个子任务合并成一个子任务, Source 和 Map 在未开启合并算子链前的子任务个数和为4,而开启合并算子链后的子任务个数和为2。

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

在一些算子操作中计算量较重,或者需要精确排查错误,则可以考虑将某些算子的合并算子链关闭,不过 Flink 会默认为我们进行优化。

// 禁用算子链 map不会与前一个算子、后一个算子相连成一个算子链
.map(word -> Tuple2.of(word, 1L)).disableChaining();

// 从当前算子开始新链 与前一个算子断开,与后面的算子相连成一个算子链
.map(word -> Tuple2.of(word, 1L)).startNewChain()

3.3 任务槽(Task Slots)

3.3.1 任务槽(Task Slots)

Flink中每一个TaskManager都是一个JVM进程,它可以启动多个独立的线程,来并行执行多个子任务(subtask)。

TaskManager的计算资源是有限的,并行的任务越多,每个线程的资源就会越少。为了控制每个TaskManager的资源,则需要在TaskManager上对每个任务运行所占用的资源做出明确的划分,这就是所谓的任务槽(task slots)。

每个任务槽(task slot)其实表示了TaskManager拥有计算资源的一个固定大小的子集。这些资源就是用来独立执行一个子任务的。

假设一个TaskManager有三个slot,那么它会将管理的内存分为3份,每个slot独享一份。这样一来,我们在slot执行一个子任务时,那么这个子任务就会独享一块内存,而不需要去和其他的任务竞争内存资源了。

不同的算子必须在不同在 Slot 中。

3.3.2 任务槽数量的设置

在 Flink 的 flink-conf.yaml 配置文件下的参数 taskmanager.numberOfTaskSlots 可配置默认并行度(默认为1)。      

注意slot目前仅仅用来隔离内存,不会涉及CPU的隔离。在具体应用时,可以将 slot 数量配置为机器的CPU核心数,尽量避免不同任务之间对CPU的竞争。这也是开发环境默认并行度设为机器CPU数量的原因。  

3.3.3 任务对任务槽的共享

在同一个作业中,不同任务节点(算子)的并行子任务可以被放到同一个 Slot 上执行

在同一个 Slot 中运行的算子必须都是来自不同的算子,且同一个 Slot 中的算子都是同时运行的。

Flink默认是允许slot共享的,如果希望某个算子对应的任务完全独占一个slot,或者只有某一部分算子共享slot,也可以通过设置“slot共享组”手动指定: 

只有属于同一个slot共享组的子任务,才会开启slot共享;不同组之间的任务是完全隔离的,必须分配到不同的slot。默认的共享组为“default”。在这种场景下,总共需要的slot数量,就是各个slot共享组最大并行度的总和。

3.3.4 任务槽和并行度的关系

Slot 是一种静态的概念,表示最大的并发上线。并行度是一种动态的概念,表示实际运行所占用的 Slot 个数

假设有三个 TaskManager,且并行度为3,则表示集群最多能并行执行9个同一算子的子任务。

定义 Flink 程序由以下转换算子:

source→ flatmap→ reduce→ sink

当他们的并行度相同时,source 和 flatmap 则可以合并算子链,于是就有三个任务节点,且可以放到一个 Slot 中。

并行度为1:

并行度为1

并行度为9:

 并行度为9,但 sink 并行度为1:

当 Job并行度(算子最大并行度) 大于 Slot 数量时,Job将无法运行。 但是使用 Yarn 模式可以动态根据所需的 Solt 数量分配足够数量的 JobManager。

3.4 作业提交流程

3.4.1 Standalone会话模式作业提交流程

 逻辑流图/作业图/执行图/物理流图

代码生成的任务的过程:逻辑流图(StreamGraph)→ 作业图(JobGraph)→ 执行图(ExecutionGraph)→ 物理图(Physical Graph)。

3.4.2 Yarn应用模式作业提交流程

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

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

相关文章

2023/10/22总结

项目上 登录注册忘记密码已经全部完善——连接数据库,发送验证码等 把ER图和项目功能点也给做完了(可能后期还需要修改 ,因为问题会在实践的时候出现) 功能点图 刷题记录 接下来的任务是争取早日完成这个项目。

图论04-【无权无向】-图的广度优先遍历BFS

文章目录 1. 代码仓库2. 广度优先遍历图解3.主要代码4. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 广度优先遍历图解 3.主要代码 原点入队列原点出队列的同时,将与其相邻的顶点全部入队列下一个顶点出队列出队列的同时,将…

Python基础入门例程4-NP4 读入整数数字

描述 在学会读入字符串以后,小白还想要读入整数,请你帮他使用input函数读入数字并输出数字与变量类型。 输入描述: 输入只有整数。 输出描述: 将输入的数字输出,同时换行输出变量类型。 示例1 输入: …

《算法通关村第二关黄金挑战一一K个一组反转》

《算法通关村第二关黄金挑战一一K个一组反转》 描述 每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 解法 头插法 理解…

【超级基础版】十进制与二进制的转换

目录 一、为什么是二进制? 二、二进制的加法和乘法 三、二进制向十进制转换 四、十进制整数向二进制转换 五、十进制小数向二进制小数的转换 六、八进制和十六进制的引入 一、为什么是二进制? 我们知道电脑的数据本质上是0和1,就是我们…

已更新!c++第四章知识点合集(自定义函数的格式和使用方法详解, #include,函数的嵌套 递归,局部变量与全局变量的区别等等)

c知识点合集已经完成欢迎前往主页查看,点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL知识点持续更新中 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL-第三章节DCL-管理用户&…

库函数qsort的使用

在排序时,我们通常写的函数只能排一种固定的类型,那有没有一种方法可以用来对所有的数据类型,进行排序呢?库函数中的qsort函数就可以实现这种排序。 首先qsort的函数参数有四个,第一个是数组的起始地址(即数组名)&…

【ML】cheatsheet

LR 原理与面试题目DT, Adaboost, GBDT, xgboost 原理 细节 与 例子 https://www.cnblogs.com/createMoMo/p/12635709.html xgboost挺详细的算法原理与例子 https://zhuanlan.zhihu.com/p/660468945 着重lightgbm就xgboost的改善方向 https://zhuanlan.zhihu.com/p/366952043机器…

什么是卷积神经网络?解决了什么问题?

什么是卷积神经网络? 卷积神经网络(Convolutional Neural Network,CNN)是一种深度神经网络模型,主要用于图像识别、语音识别和自然语言处理等任务。它通过卷积层、池化层和全连接层来实现特征提取和分类。 解决了什么问…

pycharm使用Git拉取最新代码(配置了远程服务器)

首先分享一下如何在pycharm设置代理(毕竟pull代码往往是从GitHub上)。因为即便本地开启了代理,PyCharm并不会自动使用它。需要在PyCharm的设置中手动配置代理。 下面是在PyCharm中设置代理的步骤: 主菜单中选择File > Settin…

Node学习笔记之MySQL基本使用

使用 SQL 管理数据库 其实写接口简单来说就是操作数据库数据,所以我们需要学会数据库的增、删、查、改等基本操作 1. 什么是 SQL SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据…

Kubernetes技术与架构-网络 1

基于OSI网络模型,Kubernetes集群的网络策略包括7层负载均衡的网关路由策略,以及4层3层的网络IP地址策略,这些网络策略是保证Kubernetes集群内Pod之间的网络访问的互联互通,本文主要描述Kubernetes集群的网络策略的基本使用方式。 …

基于nodejs+vue旅行社网站系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

Linux笔记之diff和vimdiff

Linux笔记之diff和vimdiff code review! 文章目录 Linux笔记之diff和vimdiff一.diff1.1.使用diff比较文件夹1.2.使用diff比较文件1.4.colordiff——带颜色输出差异 二.vimdiff2.1.vimdiff颜色差异2.2.vimfiff调整栏宽2.3.修改颜色变谈,使代码可以看清楚2.4.vimdif…

[AUTOSAR][诊断管理][ECU][$14] 清除诊断相关信息

文章目录 一、简介(1)应用场景(2)清除DTC原理(3) 请求格式二、示例代码(1) 14_cls_dtc_info.c三、 常见bug大揭秘一、简介 根据ISO14119-1标准中所述,诊断服务14主要用于Client向Server(ECU)请求清除诊断相关信息。 (1)应用场景 一般而言,14诊断服务,主要应用场景…

面向对象(基础)特征一:封装性(encapsulation)

文章目录 一、介绍(1)封装性(2)权限修饰符 二、案例(1)案例1 三、练习(1)练习1(2)练习2(3)练习3(4)练习4 面向…

【2023年11月第四版教材】软考高项极限冲刺篇笔记(3)

8 成本管理 成本类型:可变成本、固定成本、直接成本、间接成本、机会成本、沉没成本 应急储备:成本基准内 管理成本:成本基准外 进度偏差:SV,SPI 成本管理主要是规划和控制 成本估算 类比估算 参数估算 自上而下估算 三点估算 备选方案分析 储备分析 质量成本 总资…

strstr函数和strtok函数

文章目录 strstr函数函数使用函数模拟实现strtok函数 strstr函数 参数为两个字符串的地址&#xff0c;在str1中找str2不包括结束符。 函数使用 #include<stdio.h> #include<string.h>int main() {char* str1 "abcdeffgmnlo";char* str2 "de"…

《语音优先》智能语音技术驱动的交互界面设计与语音机器人设计(译者序)...

“言为心声,语为心境”&#xff0c;语言与对话是我们沟通与协作的重要方式。而智能语音技术是一种基于人工智能和自然语言处理技术的语音交互技术。它可以通过语音识别技术将用户的语音指令转换为文本&#xff0c;然后通过自然语言处理技术对文本进行分析和理解&#xff0c;最终…

TP-LINK XDR6088 WiFi6路由器 简单开箱评测

TL-XDR6088易展版AX6000双频WiFi6路由器 简单开箱测评&#xff0c;双2.5G网口&#xff0c;双频8流&#xff0c;8颗FEM&#xff0c;支持Docker。 TP-LINK XDR5470 WiFi6路由器 简单开箱评测&#xff1a;https://blog.zeruns.tech/archives/725.html TP-LINK XDR3040 WiFi6路由…