详解 Flink 的运行架构

news2024/11/22 13:23:57

一、组件

1. JobManager

作业管理器是一个 Flink 集群中任务管理和调度的核心,是控制应用执行的主进程

1.1 JobMaster
  • JobMaster 是 JobManager 中最核心的组件,负责处理单独的作业(Job)。JobMaster 和具体的 Job 是一一对应的,多个 Job 可以同时运行在一个 Flink 集群中, 每个 Job 都有一个自己的 JobMaster
  • 在作业提交时,JobMaster 会先接收到要执行的应用,即客户端提交来的 Jar 包、数据流图 (dataflow graph) 和作业图 (JobGraph);然后 JobMaster 会把 JobGraph 转换成一个物理层面的数据流图,这个图被叫作执行图 (ExecutionGraph),它包含了所有可以并发执行的任务;接着 JobMaster 会向资源管理器 (ResourceManager) 发出请求,申请执行任务必要的资源,一旦获取到了足够的资源,就会将执行图分发到真正运行它们的 TaskManager 上。而在运行过程中, JobMaster 会负责所有需要中央协调的操作,比如检查点 (checkpoints) 的协调
1.2 ResourceManager

资源管理器

  • ResourceManager 主要负责资源的分配和管理,在 Flink 集群中只有一个
  • 资源是指 TaskManager 的任务槽(task slots)。任务槽就是 Flink 集群中的资源调配单元,包含了机器用来执行计算的一组 CPU 和内存资源。每一个任务(Task)都需要分配到一个 slot 上执行
  • Flink 的 ResourceManager,针对不同的环境和资源管理平台有不同的具体实现
    • 在 Standalone 部署时,因为 TaskManager 是单独启动的(没有 Per-Job 模式),所以 ResourceManager 只能分发可用 TaskManager 的任务槽,不能单独启动新 TaskManager
    • 在有资源管理平台 (如 Yarn) 时,当新的作业申请资源,ResourceManager 会将有空闲槽位的 TaskManager 分配给 JobMaster。如果 ResourceManager 没有足够的任务槽,它可以向资源提供平台发起会话,请求提供启动新 TaskManager 进程的容器。另外,ResourceManager 还负责停掉空闲的 TaskManager,释放计算资源
1.3 Dispatcher

分发器

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

2. TaskManager

任务管理器

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

二、任务提交流程

1. 整体抽象流程

在这里插入图片描述

  • 一般情况下,由客户端(App)通过分发器提供的 REST 接口,将作业提交给 JobManager
  • 由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster
  • JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)
  • 资源管理器判断当前是否由足够的可用资源;如果没有,启动新的 TaskManager
  • TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots)
  • 资源管理器通知 TaskManager 为新的作业提供 slots
  • TaskManager 连接到对应的 JobMaster,提供 slots
  • JobMaster 将需要执行的任务分发给 TaskManager
  • TaskManager 执行任务,互相之间可以交换数据

2. Flink on Yarn 任务提交流程

2.1 会话模式任务提交流程

在这里插入图片描述

  • 先启动一个 YARN session,启动 JobManager,此时只有 ResourceManager 和 Dispatcher 在运行
  • 客户端将 flink jar 包和相关配置上传到 HDFS
  • 客户端通过 REST 接口,将作业提交给分发器
  • 分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster
  • JobMaster 向资源管理器请求资源(slots)
  • 资源管理器向 YARN 的资源管理器请求 container 资源
  • YARN 启动新的 TaskManager 容器
  • TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽
  • 资源管理器通知 TaskManager 为新的作业提供 slots
  • TaskManager 连接到对应的 JobMaster,提供 slots
  • JobMaster 将需要执行的任务分发给 TaskManager,执行任务
2.2 单作业模式任务提交流程

在这里插入图片描述

  • 客户端将作业提交给 YARN 的资源管理器,这一步中会同时将 Flink 的 Jar 包和配置上传到 HDFS,以便后续启动 Flink 相关组件的容器
  • YARN 的资源管理器分配 Container 资源,启动 Flink JobManager,并将作业提交给JobMaster。这里省略了 Dispatcher 组件
  • JobMaster 向资源管理器请求资源(slots)
  • 资源管理器向 YARN 的资源管理器请求 container 资源
  • YARN 启动新的 TaskManager 容器
  • TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽
  • 资源管理器通知 TaskManager 为新的作业提供 slots
  • TaskManager 连接到对应的 JobMaster,提供 slots
  • JobMaster 将需要执行的任务分发给 TaskManager,执行任务

三、任务调度原理

1. 整体调度过程

在这里插入图片描述

  • Flink 代码在被提交执行后首先经过优化器和图生成器会生成数据流图
  • Flink Client 的 ActorSystem 创建 Actor 将数据流图发送给 JobManager 中的 Actor
  • JobManager 会不断接收 TaskManager 的心跳消息,从而可以获取到有效的 TaskManager
  • JobManager 通过调度器在 TaskManager 中调度执行 Task (Task 对应一个线程)
  • 在程序运行过程中,Task 与 Task 之间可以进行数据传输
1.1 Job Client
  • 主要职责是提交任务, 提交后可以结束进程, 也可以等待结果返回
  • Job Client 不是 Flink 程序执行的内部部分,但它是任务执行的起点
  • Job Client 负责接受用户的程序代码,然后创建数据流,将数据流提交给 Job Manager 以便进一步执行。执行完成后,Job Client 将结果返回给用户
1.2 JobManager
  • 主要职责是调度工作并协调任务做检查点
  • 集群中至少要有一个 master,master 负责调度 task,协调checkpoints 和容错
  • 高可用设置的话可以有多个 master,但要保证一个是 leader,其他是standby
  • JobManager 包含 Actor System、Scheduler、CheckPoint 三个重要的组件
  • JobManager 从客户端接收到任务以后, 首先生成优化过的执行计划, 再调度到 TaskManager 中执行
1.3 TaskManager
  • 主要职责是从 JobManager 处接收任务, 并部署和启动任务, 接收上游的数据并处理
  • TaskManager 是在 JVM 中的一个或多个线程中执行任务的工作节点
  • TaskManager 在创建之初就设置好了 Slot, 每个 Slot 可以执行一个任务

2. 相关概念

2.1 数据流图

Dataflow Graph,Flink 程序中所有算子按照逻辑顺序连接在一起的一张图,由 Source、Transformation、Sink 三部分组成,以一个或多个 Source 开始以一个或多个 Sink 结束,类似 Spark 的 DAG

在这里插入图片描述

  • Source:数据源,Flink 在流处理和批处理上的 source 大概有 4 类:基于本地集合的 source、基于文件的 source、基于网络套接字的 source、自定义的 source。自定义的 source 常见的有 Apache kafka、RabbitMQ 等
  • Transformation:数据转换的各种操作,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select
  • Sink:接收器,Flink 将转换计算后的数据发送的地点 ,Flink 常见的 Sink 有:写入文件、打印出来、写入 socket 、自定义的 sink 。自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等
2.2 并行子任务与并行度
  • 并行子任务 (Subtask):一个算子操作可以 “复制” 成多份分布到不同的节点去运行,每个节点所运行的任务称为该算子的一个并行子任务

  • 并行度 (Parallelism):

    • 针对数据流图中的每一步操作而言,一个算子操作的并行子任务个数称之为它的并行度 (Parallelism)
    • 针对整个数据流图而言,它的所有算子操作中的最大并行度称之为整个 Stream 的并行度
      在这里插入图片描述
  • 并行度的设置:

    • Flink 代码中设置:

      //Flink环境对象调用setParallelism(n)方法设置整个程序全局的并行度
      StreamExecutionEnvironment.getExecutionEnvironment().setParallelism(2)
      
      //每个算子操作调用setParallelism(n)方法设置当前算子的并行度
      dataStream.map(word -> Tuple2.of(word, 1L)).setParallelism(2);
      
    • 提交 Flink 应用时设置

      #命令行使用 -p 设置并行度
      bin/flink run –p 2
      
      #WebUI中在提交应用的配置框中填写并行度
      
      
    • 配置文件中设置,对整个集群生效

      vim flink-conf.yaml
      
      parallelism.default: 2
      
2.3 算子链
  • 不同算子之间的数据传输方式:

    • 一对一(One-to-one,forwarding):类似 Spark 的窄依赖,从上游向下游进行数据传输不会改变数据的分区和顺序。例如:source、map、 filter、 flatMap 等算子之间的数据传输
    • 重分区(Redistributing):类似 Spark 的宽依赖和 Shuffle 过程 (重分区好比发牌,shuffle好比洗牌),上游的数据会根据不同的策略 (基于 key hash 值、broadcast、rebalance轮询以及完全随机) 传输到不同的下游中,会造成数据分区和顺序的改变。例如:map 和 keyBy 之间的数据传输、window 和 Sink 之间的数据传输
  • 算子链 (Operator Chain):并行度相同、同一个 slot 共享组且数据传输方式为 one-to-one 的算子们可以合并成为一个算子链,形成一个 Task 由一个线程执行

  • 设置:

    //全局禁用算子链
    env.disableOperatorChaining();
    
    //禁用算子链
    .map(word -> Tuple2.of(word, 1L)).disableChaining();
    
    //从当前算子开始新链
    .map(word -> Tuple2.of(word, 1L)).startNewChain()
    
2.4 Task Slot 和槽共享
  • Flink 的每一个任务 (Task) 需要一个线程来执行;TaskManager 是一个 JVM 进程,在其中可以启动多个独立线程来执行任务

  • 为了控制一个 TaskManager 能接收多少个 Task,通过 Task Slot 对每个任务运行所占用的资源
    做出明确的划分,一个 TaskManager 至少有一个 Task Slot

  • Task Slot:在 TaskManager 上拥有计算资源的一个固定大小的子集,一个 TaskManager 上的所有 Task Slot 会均分整个内存,所以任务之间不受影响

  • Task Slot 配置:

    vim flink-conf.yaml
    
    taskmanager.numberOfTaskSlots: 8
    
    #由于slot之间不会涉及 CPU 的隔离,所以可以将 slot 数量配置为机器的 CPU 核心数,尽量避免不同任务之间对 CPU 的竞争
    
  • 槽共享:默认情况下,同一个作业的不同任务节点的子任务可以在同一个 Task Slot 上执行,实现槽共享。但同一个任务节点的并行子任务必须独立占据一个 Task Slot 执行
    在这里插入图片描述

  • 通过设置 “slot 共享组” (SlotSharingGroup) 可以让某个算子对应的任务完全独占一个 slot

    //共享组名称自定义,不设置则与前一个算子同属一个共享组,默认是default
    .map(word -> Tuple2.of(word, 1L)).slotSharingGroup("1"); 
    
    //此时,整个作业总共需要的 slot 数量,就是各个 slot 共享组最大并行度的总和
    
  • 并行度与 Task Slot:并行度是程序运行时实际使用的并发线程资源;Task Slot 是整个 TaskManager 总共可用的并发线程资源

2.5 执行流程图转换
  • Flink 中执行流程图转换可以分为:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图
  • StreamGraph:逻辑流图或数据流图,它是根据用户通过 Stream API 编写的代码生成的最初的执行图,用来表示程序的拓扑结构
  • JobGraph:StreamGraph 经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化是将多个符合条件的节点 chain 在一起作为一个节点
  • ExecutionGraph:JobManager 根据 JobGraph 生成 ExecutionGraph。ExecutionGraph 是 JobGraph 的并行化版本,是调度层最核心的数据结构
  • 物理执行图:JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个 TaskManager 上部署 Task 后形成的 “图”,并不是一个具体的数据结构

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

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

相关文章

rpm安装

rpm安装 命令格式: rpm 【选项】 文件名 选项: -i:安装软件 -v:显示安装过程信息 -h:用#表示安装进度,一个#代表2% -ivh:安装软件,显示安装过程 -e:卸载软件 -q:查看软件是否安装 -ql&#xff1…

码农危是否到来? AI大模型时代到来程序员能做啥?

前言 “马斯克提到人工智能会让工作变得毫无意义,并建议人们可能需要去编写人工智能程序,以避免被AI剥夺就业”,AI大模型的爆发,各种自动化编码应用工具,AI机器人出现,“前有2023年2月份,ChatG…

「实战应用」如何用图表控件LightningChart JS创建SQL仪表板应用(一)

LightningChart JS是Web上性能特高的图表库,具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用,从而实现高刷新率和流畅的动画,常用于贸易,工程,航…

Polar Web【简单】php very nice

Polar Web【简单】php very nice Contents Polar Web【简单】php very nice思路EXP运行&总结 思路 打开网页源代码,由下图的代码,可见本题涉及到反序列化以及变量覆盖。 因此考虑传递GET参数a来构造序列字符串。 由上图中的代码,在Exampl…

8.7k Star!Khoj:你的AI第二大脑、开源RAG Cop​​ilot、平替 MS Copilot与ChatGPT

原文链接:(更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号!) 8.7k Star!Khoj:你的AI第二大脑、开源RAG Cop​​ilot、平替 MS Copilot与ChatGPT 🌟你的AI第二大脑。…

Splatter Image: Ultra-Fast Single-View 3D Reconstruction

Splatter Image: Ultra-Fast Single-View 3D Reconstruction 飞溅图像:超快速单视图3D重建 Stanislaw Szymanowicz  Christian Rupprecht  Andrea Vedaldi 克里斯蒂安鲁普雷希特安德烈韦达尔迪 Visual Geometry Group — University of Oxford {stan,chrisr,vedal…

优卡集团冲刺港股上市:90后创始团队孵化,IPO前突击大额分红

现年26岁的鲁圳,正在带领其6年以来的创业成果冲击资本市场。 近日,金融居间机构服务商优卡集团(Yoc Group)向港交所递交上市申请,民银资本为其独家保荐人。透过招股书可知,优卡集团成立于2018年&#xff0…

自动化测试-Selenium(一),简介

自动化测试-Selenium 1. 什么是自动化测试 1.1 自动化测试介绍 自动化测试是一种通过自动化工具执行测试用例来验证软件功能和性能的过程。与手动测试不同,自动化测试使用脚本和软件来自动执行测试步骤,记录结果,并比较预期输出和实际输出…

Gitlab---添加描述模版

0 Preface/Foreword Gitlab是代码托管平台,DevOps。因其免费,被广泛使用。GitLab不但可以管理代码,也可以管理issue,创建milestone等等。针对issue管理,支持描述模版功能,即对于新建的issue,可…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十八)- 微服务(8)

目录 11.4 SpringAMQP 11.4.2 Work Queue工作队列 11.4.3 发布订阅模型 11.4.4 FanoutExchange(广播交换机) 11.4.5 DirectExchange(路由模式交换机) 11.4.6 TopicExchange 11.5 消息转换器 11.4 SpringAMQP 父工程引入AMQP依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ…

redis哨兵练习

1、6台服务器&#xff0c;3台作一个主从&#xff0c;3台作哨兵 服务器IP主redis192.168.99.133从redis1192.168.99.139从redis2192.168.99.141哨兵1192.168.99.144哨兵2192.168.99.156哨兵3192.168.99.160 6台服务器安装好redis&#xff0c;全部执行&#xff1a; #把redis的…

C语言杂谈:函数栈帧,函数调用时到底发生了什么

我们都知道在调用函数时&#xff0c;要为函数在栈上开辟空间&#xff0c;函数后续内容都会在栈帧空间中保存&#xff0c;如非静态局部变量&#xff0c;返回值等。这段空间就叫栈帧。 当函数调用&#xff0c;就会开辟栈帧空间&#xff0c;函数返回时&#xff0c;栈帧空间就会被释…

读《淘宝技术这10年》:从进化中感受技术的美与挑战

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米,一个29岁的程序员,喜欢分享技术干货。今天,我想和大家聊一聊我最近读的一本书——《淘宝技术这10年》。这本书让我深刻领悟…

解决IDEA拉取或提交代码时SSL certificate problem: unable to get local issuer certificate问题

在使用IDEA拉取或提交GitHub上的代码时提示如下错误&#xff1a; 解决方法如下&#xff0c;依次执行命令&#xff1a; 在项目根目录下&#xff0c;打开Git Bash 1、echo | openssl s_client -servername github.com -connect github.com:443 | sed -ne /-BEGIN CERTIFICATE-/…

23 - 每位教师所教授的科目种类的数量(高频 SQL 50 题基础版)

23 - 每位教师所教授的科目种类的数量 考点&#xff1a; 排序和分组 selectteacher_id,count(distinct subject_id) cnt fromTeacher group byteacher_id;

SL3160 替换PN6008 耐压150V 降5V输出降压恒压芯片 脚位一样

在电子工程领域&#xff0c;芯片替换是一项常见且至关重要的任务。今天&#xff0c;我们将详细探讨SL3160芯片如何替换PN6008芯片&#xff0c;重点关注两者在耐压150V和降5V输出降压恒压方面的性能对比&#xff0c;以及它们脚位一致性的优势。 我们来了解一下SL3160和PN6008这两…

AE/PR插件中文汉化-StyleX V1.0.1动漫卡通绘画半色调漫画风格化特效

插件StyleX是一款采用人工智能AI技术的高级视频风格化工具&#xff0c;它不仅可以将素材转换为高质量的卡通片&#xff0c;还可以生成给定图像或视频风格的任意风格化视频。使用此工具&#xff0c;用户可以轻松创建创意风格化效果&#xff0c;例如卡通、绘画、绘画、半色调等等…

【大数据】计算引擎:Spark核心概念

目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…

翻译《The Old New Thing》- What’s with this MSH_MOUSEWHEEL message?

Whats with this MSH_MOUSEWHEEL message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080806-00/?p21353 Raymond Chen 2008年06月06日 MSH_MOUSEWHEEL 消息是怎么回事&#xff1f; 硬件团队正在研发一种鼠标滚轮设备&#xff0c;并…

LlamaIndex 一 简单文档查询

前言 在学习LangChain的时候&#xff0c;我接触到了LlamaIndex。它犹如我在开发vue时用到的axios&#xff0c;主要负责数据打理。别问我为什么打这个比方&#xff0c;前端老狗&#xff0c;重走AI路&#xff0c;闭关一年能否学的妥当&#xff1f; LlamaIndex 是一个用于 LLM 应…