Flink job的提交流程
在Flink中,作业(Job)的提交流程是一个复杂的过程,涉及多个组件和模块,包括作业的编译、优化、序列化、任务分发、任务调度、资源分配等。Flink通过分布式架构来管理作业的生命周期,确保作业在不同节点上以高效和容错的方式运行。我们可以从底层原理和源码层面详细解析Flink作业的提交流程。
1. Flink的架构组件
Flink作业提交流程的底层实现涉及以下几个核心组件:
- Client:用户通过Client提交作业,通常是通过Flink的API(如
DataStream
或Table
API)构建作业。 - JobManager:负责协调和管理Flink集群的运行时组件。其主要职责是作业的调度、资源分配、故障恢复等。
- TaskManager:负责在各个工作节点上执行作业的具体任务(Task),并与JobManager通信,报告状态和进度。
- Dispatcher:负责接受Client的作业请求,并将作业传递给JobManager处理。
- ResourceManager:负责资源的分配和调度,确保集群有足够的资源来运行提交的作业。
2. 作业提交流程的概览
Flink作业的提交流程可以分为以下几个主要步骤:
- 用户代码编写与作业构建:用户通过Flink API构建Flink作业逻辑,生成相应的
StreamGraph
(流作业)或Table
作业。 - 生成JobGraph:Client将用户定义的逻辑转换为Flink内部的
JobGraph
,这是Flink理解并能够执行的作业表示。 - 向Dispatcher提交JobGraph:Client将JobGraph提交到集群的Dispatcher,Dispatcher接受作业请求。
- JobManager接管JobGraph:Dispatcher将JobGraph提交给JobManager,JobManager负责作业的调度和执行。
- JobGraph转换为ExecutionGraph:JobManager将JobGraph进一步优化并转换为
ExecutionGraph
,这是Flink真正执行的物理作业计划。 - 任务的调度与执行:JobManager将ExecutionGraph分解为多个并行子任务,调度给TaskManager去执行。
- 作业执行与监控:TaskManager执行各个子任务,并通过心跳机制向JobManager报告任务状态。
3. 从源码角度详细解析提交流程
3.1 用户提交作业
作业提交流程从用户通过ExecutionEnvironment
或StreamExecutionEnvironment
提交作业开始。下面以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将其转换为JobGraph
。JobGraph
是一个优化后的表示,它将包含计算任务的并行度、物理任务之间的依赖关系等,是Flink提交给集群进行分布式执行的作业表示。
JobGraph jobGraph = streamGraph.getJobGraph();
- JobVertex:
JobGraph
中的每个操作算子(如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, ...);
- ExecutionVertex:
ExecutionGraph
中的每个顶点代表一个具体的并行任务(即ExecutionVertex
),它们会被调度给不同的TaskManager
实例执行。 - ExecutionEdge:
ExecutionVertex
之间的依赖关系被表示为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. 重要的源码模块
- JobGraph:
org.apache.flink.runtime.jobgraph.JobGraph
,表示用户作业的逻辑执行计划。 - ExecutionGraph:
org.apache.flink.runtime.executiongraph.ExecutionGraph
,表示作业的物理执行计划,任务调度基于此结构。 - JobMaster:
org.apache.flink.runtime.jobmaster.JobMaster
,负责管理作业的整个生命周期,包括任务调度、资源分配、故障恢复等。 - ResourceManager:
org.apache.flink.runtime.resourcemanager.ResourceManager
,负责资源的管理和分配,确保作业运行时所需的计算资源。 - TaskManager:
org.apache.flink.runtime.taskmanager.TaskManager
,在每个节点上运行,负责执行具体的任务并与JobManager协调。
5. Flink作业提交流程总结
- 用户通过Client提交Flink作业,作业被转换为JobGraph。
- JobGraph通过Dispatcher提交给JobManager,JobManager将其转换为ExecutionGraph。
- JobManager与ResourceManager交互,申请并分配资源,调度任务到TaskManager执行。
- TaskManager执行任务,并定期向JobManager报告任务状态。
- 整个流程基于高效的分布式架构和容错机制,保证作业的稳定和可靠执行。
这就是Flink作业从提交到执行的详细提交流程,从底层原理和源码层面揭示了Flink的作业管理机制。
相关文章:

Flink job的提交流程
在Flink中,作业(Job)的提交流程是一个复杂的过程,涉及多个组件和模块,包括作业的编译、优化、序列化、任务分发、任务调度、资源分配等。Flink通过分布式架构来管理作业的生命周期,确保作业在不同节点上以高…...
git操作pull的时候出现冲突怎么解决
问: PS C:\Users\fury_123\Desktop\consumptionforecast> git branch * dev main PS C:\Users\fury_123\Desktop\consumptionforecast> git add . PS C:\Users\fury_123\Desktop\consumptionforecast> git commit -m 修改部分样式 [dev 74693e0] 修改部分样…...

Sentinel 1.80(CVE-2021-44139)
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 Report a Sentinel Security Vulnerability …...

黑马程序员C++提高编程学习笔记
黑马程序员C提高编程 提高阶段主要针对泛型编程和STL技术 文章目录 黑马程序员C提高编程一、模板1.1 函数模板1.1.1 函数模板基础知识 案例一: 数组排序1.2.1 普通函数与函数模板1.2.2 函数模板的局限性 1.2 类模板1.2.1 类模板的基础知识1.2.2 类模板与函数模板1.…...

力扣第1题:两数之和(图解版)
Golang版本 func twoSum(nums []int, target int) []int {m : make(map[int]int)for i : range nums {if _, ok : m[target - nums[i]]; ok {return []int{i, m[target - nums[i]]}} m[nums[i]] i}return nil }...

aws(学习笔记第三课) AWS CloudFormation
aws(学习笔记第三课) 使用AWS CloudFormation 学习内容: AWS CloudFormation的模板解析使用AWS CloudFormation启动ec2 server 1. AWS CloudFormation 的模版解析 CloudFormation模板结构 CloudFormation是AWS的配置管理工具,属于Infrastructure as Co…...

浅学React和JSX
往期推荐 一文搞懂大数据流式计算引擎Flink【万字详解,史上最全】-CSDN博客 数仓架构:离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖-CSDN博客 一文入门大数据准流式计算引擎Spark【万字详解,全网最新】_大数据 spark-CSDN博客 浅谈维度建…...
React 为什么 “虚拟 DOM 顶部有很多 provider“?
1、介绍React中的Context Provider 在 React 中,虚拟 DOM(Virtual DOM)是 React 用来高效更新 UI 的核心机制,它通过对比前后两次虚拟 DOM 树,确定哪些部分需要更新,以减少直接操作真实 DOM 的开销。而 “…...
忘记了 MySQL 8.0 的 root 密码,应该怎么办?
如果你忘记了 MySQL 8.0 的 root 密码,可以通过以下步骤来重置密码。请注意,这些步骤需要你有对 MySQL 服务器的物理或命令行访问权限。 步骤 1: 停止 MySQL 服务 首先,你需要停止正在运行的 MySQL 服务。你可以使用以下命令来停止 MySQL 服…...
Promise.reject()
Promise.reject() 静态方法返回一个已拒绝(rejected)的 Promise 对象,拒绝原因为给定的参数。 语法 Promise.reject(reason)参数 reason 该 Promise 对象被拒绝的原因。 返回值 返回一个已拒绝(rejected)的 Promi…...

大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

云手机与传统手机的区别是什么?
随着科技的快速进步,云手机逐渐成为手机市场的热门选择。与传统的智能手机相比,云手机具有许多独特的功能和优势,尤其在多账号管理和高效操作方面备受关注。那么,云手机究竟与普通手机有哪些区别呢? 1. 更灵活的操作与…...

微知-Bluefield DPU命名规则各字段作用?BF2 BF3全系列命名大全
文章目录 背景字段命名C是bmc的意思NOT的N是是否加密S表示不加密但是secureboot enable倒数第四个都是E倒数第五个是速率 V和H是200GM表示E serials,H表示P serials(区别参考兄弟篇:[more](https://blog.csdn.net/essencelite/article/detail…...
Ubuntu 上使用 Nginx 实现反向代理并启用 HTTPS(详细教程)
拒绝使用宝塔,虽然宝塔很好用方便,但是他非常占用资源,所以我正在尝试转换我使用服务器的方式,通过命令来才做这些,下面是我的详细步骤。 在这篇教程中,我们将详细介绍如何在 Ubuntu 系统上使用 Nginx 搭建…...
2. 继承Mono的单例模式基类
前提 继承MonoBehaviour的脚本不能new继承MonoBehaviour的脚本一定得依附在GameObject上 实现挂载式的单例模式基类 挂载式 继承Mono的单例模式基类 /// <summary> /// 挂载式 继承Mono的单例模式基类 /// </summary> /// <typeparam name"T">&…...

数据治理:制造企业转型的关键要素与战略需求
制造业,作为国民经济的主体,是立国之本、兴国之器、强国之基。从工业文明的曙光初现,到今日全球化的激烈竞争,始终昭示着一个真理:没有强大的制造业,就没有国家和民族的强盛。 为全面推进制造强国建设&…...
FastAPI 基本路由
FastAPI 基本路由 FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,与 Python 3.6+ 类型提示一起使用。在本文中,我们将探讨 FastAPI 的基本路由概念,包括如何定义路由、处理请求和响应,以及一些高级特性。 什么是路由? 在 Web 框架中,路由是指将传入的…...

Python库matplotlib之六
Python库matplotlib之六 动画FuncAnimation构造器成员函数应用例子 动画 Matplotlib基于其绘图功能,还提供了一个使用动画模块,生成动画的接口。动画是一系列帧,其中每个帧对应于图形上的一个图。 Matplotlib使用两个类来实现动画ÿ…...

十一、数据库的设计规范
文章目录 1. 为什么需要数据库设计2. 范式2.1 范式介绍2.2 范式都包括哪些2.3 键和相关属性的概念2.4 第一范式(1st NF)2.5 第二范式(2nd NF)2.6 第三范式(3rd NF)2.7 小结3. 反范式化3.1 概述3.2 应用举例3.3 反范式的新问题3.4 反范式的使用场景3.4.1 增加冗余字段的建议3.…...

这届物理与化学诺奖对S2AIAI4S的启示
物理学与AI看似神秘而又简洁的纠缠 随着今年诺贝尔物理学奖(这篇还没来得及发,化学奖也...)的颁布,不管是国内某圈还是国外某管,无论是学术界又或产业界,充斥着震惊又或是“物理学不存在了”之类的调侃&am…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...