当前位置: 首页 > news >正文

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的作业管理机制。

相关文章:

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">&…...

数据治理:制造企业转型的关键要素与战略需求

制造业&#xff0c;作为国民经济的主体&#xff0c;是立国之本、兴国之器、强国之基。从工业文明的曙光初现&#xff0c;到今日全球化的激烈竞争&#xff0c;始终昭示着一个真理&#xff1a;没有强大的制造业&#xff0c;就没有国家和民族的强盛。 为全面推进制造强国建设&…...

FastAPI 基本路由

FastAPI 基本路由 FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,与 Python 3.6+ 类型提示一起使用。在本文中,我们将探讨 FastAPI 的基本路由概念,包括如何定义路由、处理请求和响应,以及一些高级特性。 什么是路由? 在 Web 框架中,路由是指将传入的…...

Python库matplotlib之六

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

十一、数据库的设计规范

文章目录 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看似神秘而又简洁的纠缠 随着今年诺贝尔物理学奖&#xff08;这篇还没来得及发&#xff0c;化学奖也...&#xff09;的颁布&#xff0c;不管是国内某圈还是国外某管&#xff0c;无论是学术界又或产业界&#xff0c;充斥着震惊又或是“物理学不存在了”之类的调侃&am…...

3步实现B站视频音频高效下载:BilibiliDown终极解决方案全指南

3步实现B站视频音频高效下载&#xff1a;BilibiliDown终极解决方案全指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mi…...

DeepSeek-R1-Distill-Llama-8B部署全攻略:一条命令搞定推理模型

DeepSeek-R1-Distill-Llama-8B部署全攻略&#xff1a;一条命令搞定推理模型 1. 模型简介 1.1 什么是DeepSeek-R1系列&#xff1f; DeepSeek-R1是专为推理任务优化的语言模型系列&#xff0c;包含两个核心版本&#xff1a; DeepSeek-R1-Zero&#xff1a;完全通过强化学习训练…...

高效利用CompactGUI社区协作:释放游戏压缩数据价值的全方位指南

高效利用CompactGUI社区协作&#xff1a;释放游戏压缩数据价值的全方位指南 【免费下载链接】CompactGUI Transparently compress active games and programs using Windows 10/11 APIs 项目地址: https://gitcode.com/gh_mirrors/co/CompactGUI 在数字游戏时代&#xf…...

如何用Keep开源告警平台在15分钟内终结告警疲劳

如何用Keep开源告警平台在15分钟内终结告警疲劳 【免费下载链接】keep The open-source alerts management and automation platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 你是否每天被数百条重复告警轰炸&#xff1f;运维团队是否在多个监控工具间…...

别再死记硬背了!用一次完整的网页访问,帮你彻底搞懂HCIA/HCIP里的TCP/IP和OSI模型

从输入网址到页面加载&#xff1a;用真实场景拆解TCP/IP与OSI模型 想象一下这个场景&#xff1a;你在浏览器地址栏输入"www.baidu.com"&#xff0c;按下回车键&#xff0c;不到一秒就看到了熟悉的搜索页面。这看似简单的操作背后&#xff0c;隐藏着一场精密的网络协议…...

中国 AI 大模型应用市场趋势分析报告

中国 AI 大模型应用市场趋势分析报告 报告类型&#xff1a;新兴趋势识别 蓝海机会评估 覆盖市场&#xff1a;中国大陆 数据时效&#xff1a;截至 2026 年 3 月 研究方法&#xff1a;多源数据交叉验证&#xff08;艾媒咨询、中商情报、36氪研究院、虎嗅、中国工业互联网研究院等…...

ChatTTS 小说播音参数优化指南:如何实现自然流畅的语音合成

最近在做一个有声小说项目&#xff0c;尝试了多种语音合成方案&#xff0c;最终发现 ChatTTS 在中文小说播音的灵活性和自然度上表现相当不错。不过&#xff0c;刚上手时&#xff0c;直接使用默认参数生成的语音总感觉“味儿不对”&#xff0c;要么像机器人念稿&#xff0c;要么…...

Awoo Installer:为什么这款Switch安装工具能让你告别安装烦恼?

Awoo Installer&#xff1a;为什么这款Switch安装工具能让你告别安装烦恼&#xff1f; 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Instal…...

探索双闭环直流调速系统的仿真之旅:从疑惑到理解

simulink双闭环直流调速系统matlab仿真在学习直流调速系统的过程中&#xff0c;双闭环控制总让我感到有些困惑。PID控制器的参数如何选择&#xff1f;电流环和速度环之间到底有什么联系&#xff1f;带着这些问题&#xff0c;我决定通过Simulink仿真来寻找答案。 一、搭建仿真模…...

网易云音乐无损音乐下载器:5分钟搞定你的私人音乐库终极方案

网易云音乐无损音乐下载器&#xff1a;5分钟搞定你的私人音乐库终极方案 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为网易云音乐的无损音乐无…...