【入门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便于调试(默认8081端口):

需要添加如下依赖:

        <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.mfbz.cn/a/116359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基站/手机是怎么知道信道情况的?

在无线通信系统中&#xff0c;信道的情况对信号的发送起到至关重要的作用&#xff0c;基站和手机根据信道的情况选择合适的资源配置和发送方式进行通信&#xff0c;那么基站或者手机是怎么知道信道的情况呢&#xff1f; 我们先来看生活中的一个例子&#xff0c;从A地发货到B地…

【中国知名企业高管团队】系列58:创维SKYWORTH

昨天华研荟介绍了位于深圳的彩电三巨头之一——康佳KONKA&#xff0c;今天介绍创维SKYWORTH。两家公司都是以做电视起家的&#xff0c;但是发展历程和现在的业务差别非常大&#xff0c;当然&#xff0c;过程中发生的故事也是波澜起伏。 一、关于创维 创维集团有限公司&#x…

Ansible中的角色使用

Ansible中的角色使用&#xff1a; 目录 一、ansible角色简介 二、roles目录结构 三、roles的创建 四、roles的使用 1、书写task主任务 2、触发器模块 3、变量模块 4、j2模块 5、files模块 6、启用模块 7、执行playbook 五、控制任务执行顺序 六、多重角色的使用 一…

2024天津理工大学中环信息学院专升本机械设计制造自动化专业考纲

2024年天津理工大学中环信息学院高职升本科《机械设计制造及其自动化》专业课考试大纲《机械设计》《机械制图》 《机械设计》考试大纲 教 材&#xff1a;《机械设计》&#xff08;第十版&#xff09;&#xff0c;高等教育出版社&#xff0c;濮良贵、陈国定、吴立言主编&#…

Java通过cellstyle属性设置Excel单元格常用样式全面总结

最近做了一个导出Excel的功能&#xff0c;导出是个常规导出&#xff0c;但是拿来模板一看&#xff0c;有一些单元格的样式设置&#xff0c;包括合并&#xff0c;背景色&#xff0c;字体等等&#xff0c;毕竟不是常用的东西&#xff0c;需要查阅资料完成&#xff0c;但是搜遍全网…

Django开发实例总结(入门级、4.2.6、详细)

目录 概述 Django的核心组件包括 Django的项目结构 创建工程&#xff08;4.2.6&#xff09; 实例一&#xff1a;Hello world 实例二&#xff1a;访问一个自定义主页 实例三&#xff1a;通过登录跳转到主页 实例四&#xff1a;主页添加静态文件&#xff0c;包含js、css、…

初识JVM

1. JVM内存区域划分 jvm在启动的时候&#xff0c;会申请到一整个很大的内存区域。整个一大块区域&#xff0c;不太好用。为了更方便使用&#xff0c;把整个区域隔成了很多区域&#xff0c;每个区域都有不同的作用。 本地方法栈 此处提到的栈和数据结构中的栈不是一个东西&…

axios 实现请求重试

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 请求重试的核心是可以重放请求&#xff0c;具体实现就是在 axios 中&#xff0c;拿到当前请求的 config 对象&#xff0c;再用 axios 实例&#xff0c;就能重放请求。 在无感刷新…

iOS App Store上传项目报错 缺少隐私政策网址(URL)解决方法

iOS App Store上传项目报错 缺少隐私政策网址(URL)解决方法 一、问题如下图所示&#xff1a; 二、解决办法&#xff1a;使用Google浏览器&#xff08;翻译成中文&#xff09;直接打开该网址 https://www.freeprivacypolicy.com/free-privacy-policy-generator.php 按照要求…

面试10000次依然会问的【ReentrantLock】,你还不会?

引言 在并发编程的世界中&#xff0c;ReentrantLock扮演着至关重要的角色。它是一个实现了重入特性的互斥锁&#xff0c;提供了比synchronized关键字更加灵活的锁定机制。ReentrantLock属于java.util.concurrent.locks包&#xff0c;是Java并发API的一部分。 与传统的synchro…

ActiveMQ、RabbitMQ、RocketMQ、Kafka介绍

一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字&#xff1a;解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接&#xff0c;推送系统人员信息&#xff0c;通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整&#xff0c;或者推送过…

【Redis】Redis在Linux与windows上的安装基本操作语法

一、Redis简介 Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保持在磁盘中&#xff0c;重启的时候可以再…

突破性技术!开源多模态模型—MiniGPT-5

多模态生成一直是OpenAI、微软、百度等科技巨头的重要研究领域&#xff0c;但如何实现连贯的文本和相关图像是一个棘手的难题。 为了突破技术瓶颈&#xff0c;加州大学圣克鲁斯分校研发了MiniGPT-5模型&#xff0c;并提出了全新技术概念“Generative Vokens "&#xff0c…

mysql之基础语句

数据库的列类型 int&#xff1a;整型 用于定义整数类型的数据 float&#xff1a;单精度浮点4字节32位 准确表示到小数点后六位 double&#xff1a;双精度浮点8字节64位 char&#xff1a;固定长度的字符类 用于定义字符类型数据&…

Rust编程基础核心之所有权(下)

1.变量与数据交互方式之二: 克隆 在上一节中, 我们讨论了变量与数据交互的第一种方式: 移动, 本节将介绍第二种方式:克隆。 如果我们 确实 需要深度复制 String 中堆上的数据&#xff0c;而不仅仅是栈上的数据&#xff0c;可以使用一个叫做 clone 的通用函数。 看下面的代码…

Hybrid App(原生+H5)开发

介绍 市面上主流的hybrid app框架主要有 React Native&#xff1a;由FaceBook开发&#xff0c;使用JavaScript和React来构建原生应用程序Flutter&#xff1a;由Google开发&#xff0c;使用Dart语言。Flutter使用自己的渲染引擎Ionic&#xff1a;基于 Web 技术&#xff08;HTM…

网络安全(网络安全)小白自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

一、Hadoop初始化配置(final+ubuntu保姆级教程)

1、配置虚拟机 三台虚拟机&#xff0c;分别为node1、node2、node3&#xff0c;内存分别为4G、2G、2G&#xff0c;现存最好为&#xff08;>40G&#xff09;&#xff0c;如下&#xff1a; 2、修改主机名 分别打开三台虚拟机&#xff0c;root用户输入一下命令&#xff1a; no…

蓝桥杯官网填空题(方格填数)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 在 2 行 5 列的格子中填入 1 到 10 的数字。 要求&#xff1a; 相邻的格子中的数&#xff0c;右边的大于左边的&#xff0c;下边的大于上边的。 如下图所示的 …

鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

一、鸿蒙Liteos读源码教程 鸿蒙的源码是放在openharmony文件夹下&#xff0c;openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。 内核是操作系统的核心部分&#xff0c;所以像负责&#xff1a;资源管理、任务调度、内存管理、设备驱动、进程通信的源码都可以在…
最新文章