【入门Flink】- 05Flink运行时架构以及一些核心概念

系统架构

Flink运行时架构Standalone会话模式为例

image-20231104111417913

1)作业管理器(JobManager)

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

JobManger 又包含 3 个不同的组件。

(1)JobMaster

JobMaster 是 JobManager 中最核心的组件,负责处理单独的作业(Job)。JobMaster和具体的 Job 是一一对应的,多个 Job 可以同时运行在一个 Flink 集群中,每个Job都有一个自己的 JobMaster

  1. 在作业提交时,JobMaster 会先接收到要执行的应用。JobMaster 会把JobGraph转换成一个物理层面的数据流图,这个图被叫作“执行图”(ExecutionGraph),它包含了所有可以并发执行的任务。
  2. JobMaster 会向资源管理器(ResourceManager)发出请求,申请执行任务必要的资源。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。

而在运行过程中 , JobMaster 会负责所有需要中央协调的操作。

(2)资源管理器(ResourceManager)

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

(3)分发器(Dispatcher)

Dispatcher 主要负责提供一个 REST 接口,用来提交应用,并且负责为每一个新提交的作业启动一个新的 JobMaster 组件。Dispatcher 也会启动一个 Web UI,用来方便地展示和监控作业执行的信息。

2)任务管理器(TaskManager)

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

启动之后,TaskManager 会向资源管理器注册它的 slots;收到资源管理器的指令后,TaskManager 就会将一个或者多个槽位提供给 JobMaster 调用,JobMaster 就可以分配任务来执行了。 在执行过程中,TaskManager 可以缓冲数据,还可以跟其他运行同一应用的TaskManager交换数据。

核心概念

1)并行度(Parallelism)

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

image-20231104112830661

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

一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。包含并行子任务的数据流,就是并行数据流

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

上图数据流中有 source、map、window、sink 四个算子,其中sink算子的并行度为 1,其他算子的并行度都为 2。所以这段流处理程序的并行度就是2。

(2)并行度的设置

在 Flink 中,可以用不同的方法来设置并行度,它们的有效范围和优先级别也是不同的。

  • 直接代码设置

代码中在算子后跟着调用 setParallelism()方法,来设置当前算子的并行度:

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

调用执行环境的 setParallelism()方法,全局设定并行度:

env.setParallelism(2);

这样代码中所有算子,默认的并行度就都为 2 。

调试可以使用本地环境,自带Web UI便于调试:

image-20231104122134413

可能需要添加如下依赖:

        <dependency><groupId>org.apache.flink</groupId><artifactId>flink-runtime-web</artifactId><version>${flink.version}</version><scope>provided</scope></dependency>

注意:keyBy 不是算子,所以无法对 keyBy 设置并行度。

  • 提交应用时设置

-p 参数来指定当前应用程序执行的并行度,它的作用类似于执行环境的全局设置:

bin/flink run -m 192.168.197.130:8081 -p 2 -c com.lkl.StreamSocketWordCount ../day5-flink-1.0-SNAPSHOT.jar

在 Web UI 上提交作业,也可以在对应输入框中直接添加并行度。

image-20231104123336659

  • 配置文件中设置

直接在集群的配置文件 flink-conf.yaml 中直接更改默认并行度:

parallelism.default: 2

初始值为1。

在没有指定并行度的时候,就会采用配置文件中的集群默认并行度。在开发环境中,没有配置文件,默认并行度就是当前机器的CPU核心数

并行度设置优先级

代码:算子 > 代码:env > 提交时指定 > 配置文件

2)算子链(Operator Chain)

(1)算子间的数据传输

image-20231104151241512

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

1. 一对一(One-to-one,forwarding)

图中的source 和map算子,source 算子读取数据之后,可以直接发送给 map 算子做处理,它们之间不需要重新分区,也不需要调整数据的顺序。map 算子的子任务,看到的元素个数和顺序跟source算子的子任务产生的完全一样,保证着“一对一”的关系。map、filter、flatMap等算子都是这种one-to-one的对应关系。这种关系类似于 Spark 中的窄依赖

2. 重分区(Redistributing)

这种模式,数据流的分区会发生改变。比如图中的map和后面的keyBy/window算子之间,以及 keyBy/window 算子和 Sink 算子之间,都是这样的关系。

每一个算子的子任务,会根据数据传输的策略,把数据发送到不同的下游目标任务。这些传输方式都会引起重分区的过程,这一过程类似于 Spark 中的shuffle

(2)合并算子链

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

image-20231104152204398

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

Flink 默认会按照算子链的原则进行链接合并,如果想要禁止合并或者自行定义,也可以在代码中对算子做一些特定的设置:

// 禁用算子链
.map(word -> Tuple2.of(word, 1L)).disableChaining();
// 从当前算子开始新链
.map(word -> Tuple2.of(word, 1L)).startNewChain()

禁用算子链,当前算子与前后算子都不能组成算子链。(一般不会禁用)

3)任务槽(Task Slots)

(1)任务槽(Task Slots)

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

TaskManager 的计算资源是有限的,并行的任务越多,每个线程的资源就会越少。

为了控制并发量,需要在TaskManager 上对每个任务运行所占用的资源做出明确的划分,这就是所谓的任务槽(taskslots)

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

独立内存不独立CPU(时间片轮转)

image-20231104153353299

(2)任务槽数量的设置

在 Flink 的 flink-conf.yaml 配置文件中,可以设置TaskManager 的 slot 数量,默认是 1 个 slot。

taskmanager.numberOfTaskSlots: 8

slot 目前仅仅用来隔离内存,不会涉及 CPU 的隔离。在具体应用时,可以将 slot 数量配置为机器的 CPU 核心数,尽量避免不同任务之间对CPU的竞争。

(3)任务对任务槽的共享

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

image-20231104153855330

对于第一个任务节点source→map,它的 6 个并行子任务必须分到不同的 slot 上,而第二个任务节点keyBy/window/apply的并行子任务却可以和第一个任务节点共享 slot。

将资源密集型和非密集型的任务同时放到一个 slot 中,它们就可以自行分配对资源占用的比例,从而保证最重的活平均分配给所有的 TaskManager

slot 共享另一个好处就是允许保存完整的作业管道。即使某个TaskManager 出现故障宕机,其他节点也可以完全不受影响,作业的任务可以继续执行。

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

.map(word -> Tuple2.of(word, 1L)).slotSharingGroup("aaa");

只有属于同一个 slot 共享组的子任务,才会开启 slot 共享;不同组之间的任务是完全隔离的,必须分配到不同的 slot 上

4)任务槽和并行度的关系

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

注意

slot数量 >= job并行度(算子最大并行度),job才能运行【否则无法提交任务】

如果是yarn模式,动态申请

​ 申请TM数量 = job并行度 / 每个TM的slot数,向上取整

​ 例如session模式,刚开始0个TaskMananger(设置为3个slot),0个slot

​ 此时,提交一个job并行度为10

​ 10 / 3 向上取整,申请4个TM,使用10个slot,还剩余2个slot

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

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

相关文章

聚观早报 |盒马参战双11;真我GT5 Pro将压轴登场

【聚观365】11月4日消息 盒马参战双11 真我GT5 Pro将压轴登场 奇瑞汽车10月销量创新高 iQOO 12系列将首发电竞芯片Q1 苹果CEO库克称正改善供需平衡 盒马参战双11 不少消费者反映&#xff0c;今年盒马的双11已悄然开始&#xff1a;10月20日起&#xff0c;盒马APP很多商品页…

【3D图像分割】基于 Pytorch 的 VNet 3D 图像分割3(3D UNet 模型篇)

在本文中&#xff0c;主要是对3D UNet 进行一个学习和梳理。对于3D UNet 网上的资料和GitHub直接获取的代码很多&#xff0c;不需要自己从0开始。那么本文的目的是啥呢&#xff1f; 本文就是想拆解下其中的结构&#xff0c;看看对于一个3D的UNet&#xff0c;和2D的UNet&#x…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇二)

python实现MC协议&#xff08;SLMP 3E帧&#xff09;的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样&#xff0c;可以使用现成的pymodbus模块去实现。但是&#xff0c;我们可以根据协议帧进行组包&#xff0c;自己去实现帧的格式&#xff0c;而这一切可以基于socket模…

Zephyr-7B-β :类GPT的高速推理LLM

Zephyr 是一系列语言模型&#xff0c;经过训练可以充当有用的助手。 Zephyr-7B-β 是该系列中的第二个模型&#xff0c;是 Mistralai/Mistral-7B-v0.1 的微调版本&#xff0c;使用直接偏好优化 (DPO) 在公开可用的合成数据集上进行训练 。 我们发现&#xff0c;删除这些数据集的…

系列五、映射文件xxxMapper.xml

一、概述 mapper映射文件是mybatis中最重要的部分&#xff0c;涉及到的细节也非常多。 1.1、parameterType 表示输入参数的类型。例如&#xff1a; <select id"getUserById" parameterType"integer" resultType"org.star.entity.model.UserDO&…

python自动化测试模板

1:准备html模版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口自动化…

网络协议的基本概念

网络协议的基本概念 随处可见的协议 在计算机网络与信息通信领域里&#xff0c;人们经常提及“协议”一词。互联网中常用的具有代表性的协议有IP、TCP、HTTP等。 “计算机网络体系结构”将这些网络协议进行了系统归纳。TCP/IP就是IP、TCP、HTTP等协议的集合。现在&#xff0…

DI93a HESG440355R3 通过其Achilles级认证提供网络安全

DI93a HESG440355R3 通过其Achilles级认证提供网络安全 施耐德电气宣布推出Modicon M580以太网PAC (ePAC)自动化控制器&#xff0c;该控制器采用开放式以太网标准&#xff0c;通过其Achilles级认证提供网络安全。M580 ePAC使工厂操作员能够设计、实施和运行一个积极利用开放网…

(免费领源码)java#springboot#mysql网上商城系统的设计与实现08789-计算机毕业设计项目选题推荐

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设网上商城系统。 本设…

PCL点云处理(007)-Ransac

随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法来从一系列包含有离异值的数据中计算数学模型参数的方法。 RANSAC算法本质上由两步组成&#xff0c;不断进行循环&#xff1a; 从输入数据中随机选出能组成数学模型的最小数目的元素&#xff0c;使用这些元素…

【C++】红黑树模拟实现STL中的map与set

红黑树里面具体存的是什么类型的元素&#xff0c;是由模板参数 T 来决定&#xff1a; 如果 T 是 Key 那么就是 set。 如果 T 是 pair<const Key, V>&#xff0c;那么就是 map。 1、定义红黑树的节点结构 // 定义红黑颜色 enum Colour {RED,BLACK };template<class …

C/C++数据结构之时间复杂度和空间复杂度详细解析以及力扣刷题

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.算法的…

智能井盖传感器推荐,万宾科技助力城市信息化建设

随着科技产品更新换代进程加快&#xff0c;人工智能在人们日常生活之中逐渐普及开来&#xff0c;深入人们生活的方方面面&#xff0c;影响城市基础设施建设工程。例如在大街小巷之中的井盖作为城市基础建设的一个重要部分&#xff0c;一旦出现松动倾斜或凸起等异常问题&#xf…

掌握Maven和SpringBoot的灵活性:定制化lib目录和依赖范围

前言 在开发基于Maven和SpringBoot的项目时&#xff0c;我们经常会使用第三方库来满足需求。然而&#xff0c;有时候我们需要更灵活地控制这些库的依赖范围和加载方式。本文将介绍如何使用Maven和SpringBoot实现定制化的lib目录和依赖范围。经过如下定制化后&#xff0c;打包执…

MySQL - Zero date value prohibited

问题: timestamp字段报Caused by: com.mysql.cj.exceptions.DataReadException: Zero date value prohibited 原因: timestamp字段存入了0值, 超出了最小值1900-01-01 00:00:00, 转Java对象的时候报错 解决: 1.修复或删除原数据 2. mysqlurl 中添加zeroDateTimeBehaviorconve…

ROS笔记之TF坐标变换

ROS笔记之TF坐标变换 文章目录 ROS笔记之TF坐标变换一些相关函数的用法tf::TransFormBroadcaster tf1; tf1.sendTransform()tf::StampedTransform()tf::Transform()tf::Vector3()详解br.sendTransform(tf::StampedTransform(tf::Transform(tf::Quaternion::getIdentity(),tf::V…

RT-DETR 项目【训练】【验证】【推理】脚本

文章目录 训练 --train.py推理 --detect.py验证 --val.py不训练,只查看模型结构/参数量 --test.py有同学问 RT-DETR 怎么训练,其实和 YOLOv8 几乎一样,但是有很多同学没接触过 v8 我这里直接给大家写好几个脚本,大家直接在我的脚本上调节参数就可以训练了, 脚本包含【训…

java数据机构.冒泡排序,选择排序 插入排序 递归算法,递归求阶乘,快速排序

排序算法 冒泡排序选择排序插入排序递归算法递归求1~100的和递归求阶乘 快速排序总结 冒泡排序 相邻两个元素比较,大的放右边,小的放左边 第一轮循环结束最大值已经找到,在数组最右边(归为算法) 第二轮在剩余的元素比较找到次大值,第二轮可以少循环一次 如果有n个数据,总共我们…

《python深度学习》笔记(二十):神经网络的解释方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM

原理优点缺点GAP将多维特征映射降维为一个固定长度的特征向量①减少了模型的参数量&#xff1b;②保留更多的空间位置信息&#xff1b;③可并行计算&#xff0c;计算效率高&#xff1b;④具有一定程度的不变性①可能导致信息的损失&#xff1b;②忽略不同尺度的空间信息CAM利用…

Servlet对象生命周期

Servlet 生命周期包括加载与实例化、初始化、服务请求、销毁等阶段。 ervlet 的生命周期包括以下阶段&#xff1a; 加载与实例化&#xff1a;当容器启动或者第一次请求到达时&#xff0c;Servlet 容器加载 Servlet 类并创建 Servlet 实例。 初始化&#xff1a;在 Servlet 实例…