Apache Flink中TaskManager,SubTask,TaskSlot,并行度之间的关系

news2024/9/19 10:46:27
Apache Flink 中Application 与 Job
  • 一个完整的Flink Application 一般组成如下:
    • Source 数据来源
    • Transformation 数据转换处理等
    • Sink 数据传输
  • Flink 中一个或者多个Operator(算子)组合对数据进行转换形成一个 Transformation,一个FlinkApplication开始于一个或者多个Source,结束于一个或者多个Sink
DataFlow数据流图
  • 一个Flink Job执行时候会按照Source,Transformation,Sink顺序执行,形成了一个Stream DataFlow(数据流图),数据流图是个整体展示Flink作业执行流程的高级试图。

在这里插入图片描述

SubTask子任务与并行度
  • 集群中运行Flink代码本质上就是以为并行度方式来执行,这样可以提高处理数据的吞吐量和速度。
  • 当一个Flink中有多个Operator,每个Operator有多个Subtask(子任务),不同的Operator的Subtask个数可以不一样,一个Operator有几个SubTask就代当前算子的并行度(Parallelism)是多少,Subtask在不同现场,不同物理机器或者不同容器中完全独立执行。

在这里插入图片描述

  • 以上图是DataFlow视图,下半部分是并行度DataFlow视图,Source,Map,keyBy等操作都是 2个并行度,对应有2个subtask分布式执行,Sink操作并行度1,只有一个subtask,一共是7个subTask,
  • 一个Flink Application 的并行度通常任务是所有Operator中最大的并行执行能力,以上最大2个并行度
  • 并行度设置有三种方法:
    • Operator Level(算子层面):编码的方式xxx.setparallelism(2)。当前算子有效
    • Eecution Environment Level(执行环境层面):env.setparallelism() 全局代码有效
    • Client Level(客户端层面):在Web UI上之间配置
    • System Level(系统层面):通过yaml文件配置:parallenlism.default :5
Operator Chains 算子链
  • Flink作业中,可以指定Operator Chains(算子链)将相关性非常强的算子操作绑定在一起,这样能够让转换过程上下游的Task数据处理逻辑由一个Task执行,避免因为数据在网络或者线程之间传输导致的开销,减少数据处理延迟提高数据吞吐量。
  • 如下案例,下图流程处理程序Source/map 就形成了一个算子链,keyBy/window/apply新城了算子链,分布式执行中原本需要多个task执行的操作由于存在算子链,我们可以用一SubTask分不少执行即可。

在这里插入图片描述

  • Flink中哪些操作可以合并一起?这主要取决于算子之间的并行度与算子数据之间传递的模式。

  • 一个数据流在算子之间传递数据可以是一对一(One-to-One)的模式传递

  • 也可以是重新分区(Redistributing)的模式传递,两个有区别

    • One-to-one:一对一模式例如上图中source 和Map()算子之间,保留了原宿的分区和顺序,这样处理流程是map()算子的subTask[1]处理的数据全部都是来自source的task[1] 产生的数据,并且顺序保持一致,例如 map。fllter,flatMap这些算子操作都是One-to-One数据传递模式
    • Redistributing:重新分区模式(如上面的mao 和keyBy/window之间,以及keyBy/window和Sink之间),改变了流的分区,这种情况下数据流向的分区变化了。每个算子的subtask将数据发送到不同的目标subtask,这取决于使用了什么样的算子操作,例如keyBy()是分组操作,会根据key的hash值重新分区投递,再比如,window/apply 算子操作的并行度是2,流向了并行度1的sink操作,这个过程需要通过rebalance操作将数据均匀发送到下游Subtsk中,这些都是重新分区了。
  • Flink 中 One-to-One的算子操作并行度一致,默认自动合并在一起形成一个算子链,

Fllink 执行图
  • Flink 代码提交到集群执行,最终转成task分不少的在各个节点上运行,以下我们用DataFlow的形式展示Flink中Task提交执行流程。

在这里插入图片描述

  • 客户端会按照transformation转成StreamGraph(任务流图)
  • StreamGraph按照Operator Chains 算子链和规则转换成JobGraph(作业图)在JobGraph中将并行度相同且数据流转关系位One-to-One关系的算子合并在一个task处理原来需要两个task处理的逻辑,
  • JobGraph会被提交给jobManager,最终由jobManager中的JobMaster转换成ExecutionGraph)(执行图)
  • ExecutionGraph中按照每个算子并行度来划分对应的SubTask,每个SubTask最终再次被转换成其他可以部署的对象发送到TaskManager上执行。
  • 以上整个流程是Flink任务的底层执行转换流程,基于以上流程有如下结论:
    • 在Flink中一个Task一般对应的就是一个算子或者多个算子逻辑,多个算子逻辑经过Operator Chains优化后也是由一个Task执行
    • Flink分不少运行中,Task会按照并行度划分成多个SubTask。每个SubTask由一个Thread新城执行,多个SubTask分布在不同现场不同节点形成Fllink分布式的执行。
    • SubTask是Flink任务调度的基本单元
TaskSlot任务槽
  • 提交到集群中的Flink程序最终都会换成一个一个的SubTask,SubTask是Flink任务调度的基本单元,这些task最终发送到不同taskmanager节点上分布式执行
TaskSlot任务槽
  • Flink集群中每一个TaskManager是一个JVM进程,可以在TaskManager中执行一个或者多个Subtask,为了控制Taskmanager中接受的Task数量,TaskManager节点上可以提供TaskSlot(任务槽),一个TaskManger上可以划分多个TaskSlot,TaskSlot是Flink系统中资源调度的最小单元,可以对TaskManager上资源进行划分,每个taskSlot可以运行一个或者多个subtask,每个jobManager上至少有一个taskSlot。

在这里插入图片描述

  • 以上,每个taskSlot都有固定资源,假设一个TaskManager有三个TaskSlots,那么每个TaskSlot将会平均分TaskManger的内存,那么subtask不会与其他subtask竞争内存,taskslot作用就是分离任务的托管内存,但是不会发生CPU的隔离

  • 通过调整taskSlot数量,用户可以指定每一个taskManager油多少taskSlot,

    • 可以单个,这样就独占当前JobManager的JVM
    • 多个taskSlot就有多个subTask共享同一个JVM,同一个JVM中task共享TCP连接和心跳信息,共享数据集和数据结构,从而减少Taskmanager中的task开销。
  • Flink 可以配置jobManager的taskSlot数量,来决定每个TaskManager上可以执行多个subTask,由于TaskSLot只会对内存进行隔离,不对CPU进行隔离,建议线上配置 taskSlot的📄设置和该Taskmanager节点CPU CORE 的数量保持一致

TaskSlot 共享 & SlotSharingGroup共享组
  • 默认情况Flink允许共享taskSlot,即便他们是不同subTask,只要是同一个Flink作业即可,结果就是一个SLot可以持有整个作业的管道

在这里插入图片描述

  • Flink中共享taskSlot 解决的问题:

  • 我们在提交Flink应用程序时需 要关注我们程序中到底有多少subtask,然后再衡量Flink集群中slot个数是否足够,在一定程序上需 要的slot资源较多。另外一个方面是在Flink中运行的task对CPU资源的占用不同,有CUP密集型task 操作和CPU非密集型task操作情况,例如在Flink集群中source和map操作只是读数据后转换,对CPU占用短,但是window这种穿口计算聚合操作设计大量数据计算,占用CPU资源长,这就导致运行时候source/map,sink操作非常快,window操作时间长,source/map对应的subtask会等待window对应的subtask执行,同样sink的对应的
    subtask也会等待window对应的subtask执行,站在集群slot角度上来看就出现了一些taskslot非常" 繁忙",一些taskslot非常"轻松",集群的资源综合利用不高

  • taskslot共享就可以很好地解决以上问题,Flink任务所有的subtask均衡的分散到不同的taskslot上 执行,一个taskslot贯穿执行整个流程的subtask,这样每个taskslot、每个TaskManager上的资源 使用情况非常均衡。所以允许 slot 共享有两个主要优点:

    • Flink集群所需要的taskSlot和作业中使用的最大并行度恰好一样,不需要关注Flink程序总共包含多少个subTask
    • 容易获取更好的资源利用,如果没有slot共享,非密集型subtask(source/map)将会阻塞 和 密集型subtask(window)一样多的资源,通过slot共享,确保繁重的subtask在taskManager之间公平分配

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

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

相关文章

优化业务流程的关键:深入探讨BPA流程设计

在当前竞争激烈的商业环境中,业务流程自动化(BPA)已经成为企业提升效率、减少成本和提高业务灵活性的关键工具。今天,我们将深入探讨BPA流程设计的重要性及其实施步骤,为企业提供实用的指南。 什么是BPA? …

spring揭秘00-ioc定义与ioc容器及集成工厂模式

文章目录 【README】【1】IOC概述【1.1】ioc定义【1.2】IOC三种依赖注入方式 【2】ioc服务提供者【2.1】 ioc服务提供者职责【2.2】ioc服务提供者如何管理对象间依赖关系 【3】IOC容器【3.1】BeanFactory 【4】集成工厂模式创建bean【4.1】静态工厂方法【4.2】非静态工厂方法【…

QT+CUDA 同时编译Qt和CUDA代码

工作需要把cuda的代码移植到QT中,和Qt项目一起编译,这里记录一下。 前期准备 1.安装CUDA 电脑需要安装好 CUDA,可以看我的这篇文章安装:Windows和WSL安装CUDA-CSDN博客 使用命令 nvcc --version 查看安装的 CUDA 版本。 CUDA 的默…

通过API构建开放式外卖系统平台:合作伙伴的集成与管理

随着外卖行业的迅速发展,外卖系统平台的开放性和可扩展性变得尤为重要。通过API构建一个开放式的外卖系统平台,企业可以更轻松地与合作伙伴进行集成和管理。本文将探讨如何通过API构建开放式外卖系统平台,并通过代码示例展示与合作伙伴的集成…

md-editor-v3适配VUE3的MarkDown编辑器-好用-简单-免费

官方文档: https://imzbf.github.io/md-editor-v3/zh-CN/indexhttps://imzbf.github.io/md-editor-v3/zh-CN/index 效果演示:(支持黑暗模式切换) toolbar包括: [bold,underline,italic,strikeThrough,title,sub,sup…

系统编程 day13 进程5

前提: 信息量:线程间有序的进行工作 资源的个数 机制:描述可使用资源的个数 操作: p操作:使用这个资源,表示资源个数减1 v操作:产生这个资源,表示资源个数加1 p操作逻辑&…

CoCoOp(论文解读):Conditional Prompt Learning for Vision-Language Models

摘要 随着预训练的视觉语言模型(如 CLIP)的兴起,研究使这些模型适应下游数据集的方法变得至关重要。最近CoOp方法将NLP领域中的提示学习引入到视觉领域中,来调整预训练的视觉语言模型。具体来说,CoOp 将提示中的上下文…

DataGridView用法合集(9):添加控件

目录 45. DataGridView列中显示选择框CheckBox 46. DataGridView中显示下拉框ComboBox 47. DataGridView单击打开下拉框 48. DataGridView中显示按钮 49. DataGridView中显示链接 50. DataGridView中显示图像 45. DataGridView列中显示选择框CheckBox [VB.NET] 添加Chec…

MySQL5.7数据库---入门教程(小白教程)

一、MySQL安装 本文以MySQL5.7安装为例。在设置完root密码和添加一个用户后,一路默认。 1、 2、通过点击红圈里的箭头选择对应的版本。 3、 4、端口(Port)一般默认不需要更改。 5、 二、配置环境变量 配置环境变量可以方便在win系统中cmd…

HarmonyOS 端云一体化 -- 项目初始化

HarmonyOS 端云一体化 – 项目初始化 端云一体化官方简介 本文档基于 api9 编写本来我想用最新版的api搞,但是在 AppFallery Connect 上创建项目的时候有bug,没没办法成功创建应用,无奈只能切换到 api9 版本。 1.新建项目 1.1 登录华为官…

突破大模型极限!GLM-4-long百万长文本模型上线bigmodel.cn

最近业务上多了长文本的需求,因为要在prompt里面塞进比较多的rag内容,以供决策,且这些召回的内容,都有可能用到。这非常考验大模型的长文本能力,技术选型上都要着重考察这部分。 正巧,上次清影试用后&…

游戏开放式新手引导框架设计

强制性引导:只能点某个按钮 优:程序简单 缺: 玩家体验差 开放式引导:不强制点 优:玩家体验好 缺: 程序复杂 需求分析: 1.开放式引导,引导是到达某个条件后进行一系列行为&#xff08…

水星Mercury X1轮式人形机器人结合openc算法&STag标记码视觉系统实现精确抓取!

本案例展示了如何利用视觉系统提升机械臂的抓取精度,成功实现了人形机器人的双臂抓取不在局限于单臂抓取。 引言 如今市面上已经有了许多不同类型的人形机器人,涵盖了服务行业和医疗行业等各个领域。这些机器人以其智能化和自动化的特性逐渐融入我们的日…

比例PQ阀信号放大器的选择

比例PQ阀信号放大器的选择时,需要考虑一系列的因素以确保放大器能精确匹配比例阀的需求,保障液压系统的高效和稳定运行。根据所控制的比例阀类型,选择与之兼容的放大器型号。如各厂商不带反馈比例方向阀、比例溢流阀、比例减压阀等均可用BEUE…

RabbitMQ 集群部署方案

RabbitMQ 一、安装 RabbitMQ二、更改配置文件三、配置集群四、测试 环境准备:三台服务器,系统是 CentOS7IP地址分别是: rabbitmq1:192.168.152.71rabbitmq2:192.168.152.72rabbitmq3:192.168.152.73 一、…

【一键操作】【包运行及安装教程】2024数学建模国赛(高教社杯)Latex论文模板

数学建模国赛创办于1992年,每年一届,是首批列入“高校学科竞赛排行榜”的19项竞赛之一。 作为一个重量级的赛事,一次参赛将众生受益,所以相信很多同学都在为了国奖而努力,所以针对大家的参赛论文,我们之前分…

LVS集群的NAT模式和DR模式

LVS简介 LVS(Linux Virtual Server)是一个用于负载均衡的开源软件项目,旨在通过集群技术实现高性能、高可用的服务器系统。它运行在Linux操作系统上,并且可以利用内核级的资源来提高性能和稳定性。 LVS 体系结构 LVS架构 主要…

Redis远程字典服务器(7)—— set类型详解

目录 一,基本情况 二,常用命令 2.1 sadd 2.2 smembers,sismember 2.3 spop,srandmember 2.3 smove,srem 2.4 sinter,sinterstore求交集 2.5 sunion,sunionstore求并集 2.6 sdiff&#…

Mysql视图整理

理论 初级语法及操作 操作基于navicat视图化,其他管理工具基本类似 参考即可 这里附上官网免费版下载链接:Navicat Premium Lite | 简单的数据库管理和开发工具 首先:选择选中数据库--》最上面的视图--》新建视图--》 我们可以看到这里&a…

three.js 几何体、材质和网格模型

场景Scene、相机Camera、渲染器Renderer初始化完成之后,可以向场景中添加一个简单的模型进行展示。在此之前需要了解三个概念:几何体、材质、网格模型。 几何体:表示物体的几何形状。材质:表示物体的外观效果。网格模型&#xff…