Flink job的提交流程

        在Flink中,作业(Job)的提交流程是一个复杂的过程,涉及多个组件和模块,包括作业的编译、优化、序列化、任务分发、任务调度、资源分配等。Flink通过分布式架构来管理作业的生命周期,确保作业在不同节点上以高效和容错的方式运行。我们可以从底层原理和源码层面详细解析Flink作业的提交流程。

1. Flink的架构组件

Flink作业提交流程的底层实现涉及以下几个核心组件:

  • Client:用户通过Client提交作业,通常是通过Flink的API(如DataStreamTable API)构建作业。
  • JobManager:负责协调和管理Flink集群的运行时组件。其主要职责是作业的调度、资源分配、故障恢复等。
  • TaskManager:负责在各个工作节点上执行作业的具体任务(Task),并与JobManager通信,报告状态和进度。
  • Dispatcher:负责接受Client的作业请求,并将作业传递给JobManager处理。
  • ResourceManager:负责资源的分配和调度,确保集群有足够的资源来运行提交的作业。

2. 作业提交流程的概览

Flink作业的提交流程可以分为以下几个主要步骤:

  1. 用户代码编写与作业构建:用户通过Flink API构建Flink作业逻辑,生成相应的StreamGraph(流作业)或Table作业。
  2. 生成JobGraph:Client将用户定义的逻辑转换为Flink内部的JobGraph,这是Flink理解并能够执行的作业表示。
  3. 向Dispatcher提交JobGraph:Client将JobGraph提交到集群的Dispatcher,Dispatcher接受作业请求。
  4. JobManager接管JobGraph:Dispatcher将JobGraph提交给JobManager,JobManager负责作业的调度和执行。
  5. JobGraph转换为ExecutionGraph:JobManager将JobGraph进一步优化并转换为ExecutionGraph,这是Flink真正执行的物理作业计划。
  6. 任务的调度与执行:JobManager将ExecutionGraph分解为多个并行子任务,调度给TaskManager去执行。
  7. 作业执行与监控:TaskManager执行各个子任务,并通过心跳机制向JobManager报告任务状态。

3. 从源码角度详细解析提交流程

3.1 用户提交作业

        作业提交流程从用户通过ExecutionEnvironmentStreamExecutionEnvironment提交作业开始。下面以DataStream API为例,提交流程一般是通过调用StreamExecutionEnvironment.execute()来触发。

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.fromElements(1, 2, 3, 4, 5)
   .map(i -> i * i)
   .print();
env.execute("Flink Job");

调用execute()方法后,Flink会进行以下操作:

  • 创建StreamGraph:在执行环境中,用户定义的操作被转化为StreamGraph,这是Flink作业的逻辑表示,记录了所有的操作算子及其连接关系。
    StreamGraph streamGraph = this.getStreamGraph();

3.2 生成JobGraph

        一旦StreamGraph构建完成,Flink将其转换为JobGraphJobGraph是一个优化后的表示,它将包含计算任务的并行度、物理任务之间的依赖关系等,是Flink提交给集群进行分布式执行的作业表示。

JobGraph jobGraph = streamGraph.getJobGraph();
  • JobVertexJobGraph中的每个操作算子(如map、filter等)会被转化为JobVertex,代表一个逻辑上的计算节点。
  • JobEdge:操作算子之间的连接关系会被转化为JobEdge,定义了不同JobVertex之间的数据流动。
3.3 提交JobGraph到Dispatcher

客户端通过RPC将JobGraph提交给Flink集群中的Dispatcher,由它来接管作业的调度和执行。

dispatcherGateway.submitJob(jobGraph, "Flink Job", timeout);

        Dispatcher接受到作业后,会创建一个JobManager实例来负责具体的作业执行流程。在集群模式下(如YARN、Kubernetes等),Dispatcher可能会启动一个新的JobManager(即JobMaster)实例来执行作业。

3.4 JobManager接管JobGraph

        在JobManager中,接收到JobGraph后,作业的核心执行流程将由JobMaster处理。JobMaster首先会将JobGraph进一步优化和转换为ExecutionGraph,这是Flink中实际执行任务的图结构,包含所有物理任务及其依赖关系。

ExecutionGraph executionGraph = new ExecutionGraph(jobGraph, ...);
  • ExecutionVertexExecutionGraph中的每个顶点代表一个具体的并行任务(即ExecutionVertex),它们会被调度给不同的TaskManager实例执行。
  • ExecutionEdgeExecutionVertex之间的依赖关系被表示为ExecutionEdge,用于描述不同任务之间的通信模式(如shuffle)。
3.5 任务的调度与资源分配

        JobMaster接管ExecutionGraph后,会向ResourceManager申请资源以执行任务。ResourceManager负责调度并分配资源到TaskManager,每个TaskManager会接收一部分任务并执行。

resourceManagerGateway.requestSlot(...);
  • Slot分配:每个TaskManager拥有多个Slot,表示可用的计算资源。ResourceManager根据任务并行度为ExecutionVertex分配Slot。
  • 任务调度:一旦Slot分配完成,JobMaster会将任务调度到相应的TaskManager,通过RPC调用将任务部署到这些TaskManager
3.6 任务执行与监控

        TaskManager负责执行分配到的任务,它会启动相应的线程来处理每个ExecutionVertex中的任务。任务执行过程中,TaskManager会定期通过心跳机制向JobMaster报告任务的状态和进度。

taskExecutorGateway.submitTask(...);
  • 故障恢复:如果任务失败,JobMaster会根据Flink的容错机制(如检查点机制)尝试重新调度任务,确保作业的高可用性。

4. 重要的源码模块

  • JobGraphorg.apache.flink.runtime.jobgraph.JobGraph,表示用户作业的逻辑执行计划。
  • ExecutionGraphorg.apache.flink.runtime.executiongraph.ExecutionGraph,表示作业的物理执行计划,任务调度基于此结构。
  • JobMasterorg.apache.flink.runtime.jobmaster.JobMaster,负责管理作业的整个生命周期,包括任务调度、资源分配、故障恢复等。
  • ResourceManagerorg.apache.flink.runtime.resourcemanager.ResourceManager,负责资源的管理和分配,确保作业运行时所需的计算资源。
  • TaskManagerorg.apache.flink.runtime.taskmanager.TaskManager,在每个节点上运行,负责执行具体的任务并与JobManager协调。

5. Flink作业提交流程总结

  • 用户通过Client提交Flink作业,作业被转换为JobGraph。
  • JobGraph通过Dispatcher提交给JobManager,JobManager将其转换为ExecutionGraph。
  • JobManager与ResourceManager交互,申请并分配资源,调度任务到TaskManager执行。
  • TaskManager执行任务,并定期向JobManager报告任务状态。
  • 整个流程基于高效的分布式架构和容错机制,保证作业的稳定和可靠执行。

这就是Flink作业从提交到执行的详细提交流程,从底层原理和源码层面揭示了Flink的作业管理机制。

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

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

相关文章

std::future::then的概念和使用方法

std::future::then是 C 中用于异步操作的一种机制,它允许在一个异步任务完成后,接着执行另一个操作(即延续操作)。以下是关于 std::future::then 的概念和使用方法: 1. 概念: std::future::then 的主要目…

python 边际分布图

import seaborn as snspenguins sns.load_dataset("penguins") colors {"Gentoo": #AE5259, "Adelie": #CF992C, "Chinstrap": #6B9DAA}# 分类散点图 sns.jointplot(datapenguins, x"bill_length_mm", y"bill_depth_…

MyBatisPlus分页查询

一、导入依赖 <!-- MyBatis-plus的依赖 --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version> </dependency><!-- mysql的依赖 --> &l…

CocosCreator 快速部署 TON 游戏:Web2 游戏如何使用 Ton支付

在本篇文章中&#xff0c;我们将继续探讨如何使用 Cocos Creator 开发 Telegram 游戏&#xff0c;重点介绍如何集成 TON 支付功能。通过这一教程&#xff0c;开发者将学会如何在游戏中接入 TON Connect&#xff0c;实现钱包连接、支付以及支付后的校验流程&#xff0c;最终为 W…

贴吧软件怎么切换ip

在网络使用中&#xff0c;有时我们需要切换IP地址来满足特定的需求&#xff0c;比如需要切换贴吧软件IP以进行不同的操作。本文将介绍几种贴吧切换IP地址的方法&#xff0c;帮助用户更好地管理自己的网络身份和访问权限。 1、更换网络环境‌ 通过连接到不同的Wi-Fi网络或使用移…

TON生态小游戏开发:推广、经济模型与UI设计的建设指南

随着区块链技术的快速发展&#xff0c;基于区块链的Web3游戏正引领行业变革。而TON生态小游戏&#xff0c;借助Telegram庞大的用户基础和TON&#xff08;The Open Network&#xff09;链上技术&#xff0c;已成为这一领域的明星之一。国内外开发者正迅速涌入&#xff0c;开发和…

【开源】RISC-V 修改neofetch中的Host描述

neofetch 介绍 neofetch 是一款用于在终端中显示系统信息的工具&#xff0c;其主要特点是以美观的方式展示宿主机的基本信息。它通常用于展示系统的分发版本、内核版本、硬件信息、桌面环境&#xff0c;以及一些个性化的设置&#xff0c;配合 ASCII 艺术风格的 logo&#xff0…

基于Opencv中的DNN模块实现图像/视频的风格迁移

一、DNN模块的介绍 1、简介 OpenCV中的DNN&#xff08;Deep Neural Network&#xff09;模块是一个功能强大的组件&#xff0c;它支持深度学习网络模型的加载和推理。虽然DNN模块不提供模型的训练功能&#xff0c;但它可以与主流的深度学习框架&#xff08;如TensorFlow、Caf…

Visual Studio的实用调试技巧总结

对于很多学习编程的老铁们来说&#xff0c;是不是也像下面这张图一样写代码呢&#xff1f; 那当我们这样编写代码的时候遇到了问题&#xff1f;大家又是怎么排查问题的呢&#xff1f;是不是也像下面这张图一样&#xff0c;毫无目的的一遍遍尝试呢&#xff1f; 这篇文章我就以 V…

iPhone使用指南:如何在没有备份的情况下从 iPhone 恢复已删除的照片

本指南将向您展示如何在没有备份的情况下从 iPhone 恢复已删除的照片。我们所有人在生活中的某个时刻都一定做过一些愚蠢的事情&#xff0c;例如从手机或电脑中删除一些重要的东西。这是很自然的&#xff0c;没有什么可羞耻的。您可能在辛苦工作一天后回来。当突然想看一些照片…

科技云报到:云服务的中场战事,从AI应用开始

科技云报到原创。 从去年的大模型之战&#xff0c;到今年的AI应用之争&#xff0c;云服务正在迈入全新的发展阶段。AI这个杠杆将各家厂商的竞争策略更向前推进了一步。 “云AI”能够孵化出多少可能&#xff1f;在业界眼中&#xff0c;“云AI”则意味着新的悬念&#xff1a;云计…

Java基础知识全面总结

第一章&#xff1a;类与对象 第一课&#xff1a;什么是面向对象编程 1.面向对象编程和面向过程编程的区别 无论是面向过程编程还是面向对象编程都是用于解决一个实际问题&#xff0c;当面向过程编程在解决一个问题时&#xff0c;更多的情况下是不会做出重用的设计思考的&…

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1&#xff0c;脉冲部分代码2&#xff0c;ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …

pytorh学习笔记——波士顿房价预测

机器学习的“hello world”&#xff1a;波士顿房价预测 波士顿房价预测的背景不用提了&#xff0c;简单了解一下数据集的结构。 波士顿房价的数据集&#xff0c;共有506组数据&#xff0c;每组数据共14项&#xff0c;前13项是影响房价的各种因素&#xff0c;比如&…

Nullinux:一款针对Linux操作系统的安全检测工具

关于Nullinux Nullinux是一款针对Linux操作系统的安全检测工具&#xff0c;广大研究人员可以利用该工具针对Linux目标设备执行网络侦查和安全检测。 该工具可以通过SMB枚举目标设备的安全状况信息&#xff0c;其中包括操作系统信息、域信息、共享信息、目录信息和用户信息。如…

第四次论文问题知识点及问题

1、NP-hard问题 NP-hard&#xff0c;指所有NP问题都能在多项式时间复杂度内归约到的问题。 2、启发式算法 ‌‌启发式算法&#xff08;heuristic algorithm&#xff09;是相对于最优化算法提出的。它是一种基于直观或经验构造的算法&#xff0c;旨在以可接受的花费给出待解决…

『网络游戏』进入游戏主城UI跳转主城【26】

首先在Unity客户端中创建一个空节点重命名为MainCityWnd 设置父物体为全局 创建空节点钉在左上角作为角色信息UI 在钉子下创建Image 创建脚本&#xff1a;MainCityWnd.cs 编写脚本&#xff1a;MainCityWnd.cs 挂载脚本 创建脚本&#xff1a;MainCitySys.cs 编写脚本&#xff1a…

Java中二维数组-杨辉三角

使用二维数组打印一个10行杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1&#xff09;第一行有1个元素&#xff0c;第n行有n个元素 2&#xff09;每一行的第一个元素和最后一个元素都是1 3&#xff09;从第三行开始&#xff0c;对于非第一个元素和最后一个元素的元素…

商贸物流痛点解析

商贸物流痛点解析 在当今全球化的商业环境中&#xff0c;商贸与物流之间的紧密协作已成为业务成功的关键因素。然而&#xff0c;许多组织面临着信息不对称、资源配套不足以及系统间隔离等痛点&#xff0c;这些问题严重阻碍了商贸体系与物流、仓储和园区的有效联动&#xff0c;…

[mysql]多表查询详解

我们如果要查询,我们就要用 SELECT .... FROM .... WHERE AND/OR/NOT #我们需要用过滤的条件来对数据进行筛选,不然会有很多多余数据 ORDER BY (ASC/DESC)#排序 LIMIT....,#是在几个有限的数据库管理系统里所以,PGsql,mysql,等 多表查询的意义 我们目前为止的查询语句…