【大数据】Flink 详解(六):源码篇 Ⅰ
Flink 详解(六):源码篇 Ⅰ
- 55、Flink 作业的提交流程?
- 56、Flink 作业提交分为几种方式?
- 57、Flink JobGraph 是在什么时候生成的?
- 58、那在 JobGraph 提交集群之前都经历哪些过程?
- 59、看你提到 PipeExecutor,它有哪些实现类?
- 60、Local 提交模式有啥特点,怎么实现的?
- 61、远程提交模式都有哪些?
- 62、Standalone 模式简单介绍一下?
- 63、yarn 集群提交方式介绍一下?
- 64、yarn - session 模式特点?
- 65、yarn - per - job 模式特点?
- 66、yarn - application 模式特点?
- 67、yarn - session 提交流程详细介绍一下?
- 68、yarn - per - job 提交流程详细介绍一下?
55、Flink 作业的提交流程?
Flink 的提交流程:
- 在
Flink Client
中,通过反射启动jar
中的main
函数,生成 Flink StreamGraph 和 JobGraph,将 JobGraph 提交给 Flink 集群。 - Flink 集群收到 JobGraph(
JobManager
收到)后,将 JobGraph 翻译成 ExecutionGraph,然后开始调度,启动成功之后开始消费数据。
总结来说:Flink 核心执行流程,对用户 API 的调用可以转为 StreamGraph
→ JobGraph
→ ExecutionGraph
。
56、Flink 作业提交分为几种方式?
Flink 的作业提交分为两种方式:
- Local 方式:即本地提交模式,直接在 IDEA 运行代码。
- 远程提交方式:分为
standalone
方式、yarn
方式、K8s
方式。其中,yarn
方式又分为三种提交模式:yarn-per-job
模式、yarn-session
模式、yarn-application
模式。
57、Flink JobGraph 是在什么时候生成的?
StreamGraph、JobGraph 全部是在 Flink Client
客户端生成的,即提交集群之前生成,原理图如下:
58、那在 JobGraph 提交集群之前都经历哪些过程?
- 用户通过启动 Flink 集群,使用命令行提交作业,运行
flink run -c WordCount xxx.jar
。 - 运行命令行后,会通过
run
脚本调用CliFrontend
入口,CliFrontend
会触发用户提交的jar
文件中的main
方法,然后交给PipelineExecuteor
的execute
方法,最终根据提交的模式选择触发一个具体的PipelineExecutor
执行。 - 根据具体的
PipelineExecutor
执行,将对用户的代码进行编译生成 StreamGraph,经过优化后生成 Jobgraph。
具体流程图如下:
59、看你提到 PipeExecutor,它有哪些实现类?
PipeExecutor
在 Flink 中被叫做 流水线执行器,它是一个接口,是 Flink Client
生成 JobGraph 之后,将作业提交给集群的重要环节。前面说过,作业提交到集群有好几种方式,最常用的是 yarn
方式,yarn
方式包含 3 3 3 种提交模式,主要使用 session
模式,per-job
模式。application
模式中 JobGraph 是在集群中生成。
所以 PipeExecutor
的实现类如下图所示:(在代码中按 CTRL+H
就会出来)
除了上述红框的两种模式外,在 IDEA 环境中运行 Flink MiniCluster 进行调试时,使用 LocalExecutor
。
60、Local 提交模式有啥特点,怎么实现的?
Local 是在本地 IDEA 环境中运行的提交方式。不上集群。主要用于调试,原理图如下:
-
Flink 程序由
JobClient
进行提交。 -
JobClient
将作业提交给JobManager
。 -
JobManager
负责协调资源分配和作业执行。资源分配完成后,任务将提交给相应的TaskManager
。 -
TaskManager
启动一个线程开始执行,TaskManager
会向JobManager
报告状态更改,如开始执 行,正在进行或者已完成。 -
作业执行完成后,结果将发送回客户端。
源码分析:通过 Flink 1.12.2 1.12.2 1.12.2 源码进行分析的。
(1)创建获取对应的 StreamExecutionEnvironment
对象:LocalStreamEnvironment
。
调用 StreamExecutionEnvironment
对象的 execute
方法。
(2)获取 StreamGraph。
(3)执行具体的 PipeLineExecutor
得到 localExecutorFactory。
(4) 获取 JobGraph。
根据 localExecutorFactory 的实现类 LocalExecutor 生成 JobGraph。
上面这部分全部是在 Flink Client
生成的。由于是使用 Local 模式提交,所以接下来将创建 MiniCluster 集群,由 miniCluster.submitJob
指定要提交的 jobGraph。
(5)实例化 MiniCluster 集群。
(6)返回 JobClient
客户端。
在上面执行 miniCluster.submitJob
将 JobGraph 提交到本地集群后,会返回一个 JobClient
客户端,该 JobClient
包含了应用的一些详细信息,包括 JobID、应用的状态等等。最后返回到代码执行的上一层,对应类为 StreamExecutionEnvironment
。
以上就是 Local 模式的源码执行过程。
61、远程提交模式都有哪些?
远程提交方式:分为 Standalone 方式、Yarn 方式、K8s 方式。
- Standalone:包含
session
模式。 - Yarn 方式 分为三种提交模式:
yarn-per-job
模式、yarn-Session
模式、yarn-application
模式。 - K8s 方式:包含
session
模式。
62、Standalone 模式简单介绍一下?
Standalone 模式为 Flink 集群的 单机版提交方式,只使用一个节点进行提交,常用 Session 模式。
提交命令如下:
bin/flink run org.apache.flink.WordCount xxx.jar
Client
客户端提交任务给JobManager
。JobManager
负责申请任务运行所需要的资源并管理任务和资源。JobManager
分发任务给TaskManager
执行。TaskManager
定期向JobManager
汇报状态。
63、yarn 集群提交方式介绍一下?
通过 yarn 集群提交分为 3 3 3 种提交方式:
session
模式per-job
模式application
模式
64、yarn - session 模式特点?
提交命令如下:
./bin/flink run -t yarn-session \
-Dyarn.application.id=application_XXXX_YY xxx.jar
yarn-session 模式:所有作业共享集群资源,隔离性差,JM 负载瓶颈,main
方法在客户端执行。适合执行时间短,频繁执行的短任务,集群中的所有作业只有一个 JobManager
,另外,Job 被随机分配给 TaskManager
。
特点:session-cluster
模式需要先启动集群,然后再提交作业,接着会向 Yarn 申请一块空间后,资源永远保持不变。如果资源满了,下一个作业就无法提交,只能等到 Yarn 中的其中一个作业执行完成后,释放了资源,下个作业才会正常提交。所有作业共享 Dispatcher
和 ResourceManager
,共享资源,适合规模小执行时间短的作业。
65、yarn - per - job 模式特点?
提交命令:
./bin/flink run -t yarn-per-job --detached xxx.jar
yarn-per-job 模式:每个作业单独启动集群,隔离性好,JM 负载均衡,main
方法在客户端执行。在 per-job
模式下,每个 Job 都有一个 JobManager
,每个 TaskManager
只有单个 Job。
特点:一个任务会对应一个 Job,每提交一个作业会根据自身的情况,都会单独向 Yarn 申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享 Dispatcher
和 ResourceManager
,按需接受资源申请。适合规模大长时间运行的作业。
66、yarn - application 模式特点?
提交命令如下:
./bin/flink run-application -t yarn-application xxx.jar
yarn-application 模式:每个作业单独启动集群,隔离性好,JM 负载均衡,main
方法在 JobManager
上执行。
在 yarn-per-job
和 yarn-session
模式下,客户端都需要执行以下三步,即:
- 获取作业所需的依赖项;
- 通过执行环境分析并取得逻辑计划,即
StreamGraph
→JobGraph
; - 将依赖项和 JobGraph 上传到集群中。
只有在这些都完成之后,才会通过 env.execute()
方法触发 Flink 运行时真正地开始执行作业。如果所有用户都在同一个客户端上提交作业,较大的依赖会消耗更多的带宽,而较复杂的作业逻辑翻译成 JobGraph 也需要吃掉更多的 CPU 和内存,客户端的资源反而会成为瓶颈。
为了解决它,社区在传统部署模式的基础上实现了 Application 模式。原本需要客户端做的三件事被转移到了 JobManager
里,也就是说 main()
方法在集群中执行(入口点位于 ApplicationClusterEntryPoint
),客户端只需要负责发起部署请求了。
综上所述,Flink 社区比较推荐使用 yarn-per-job
或者 yarn-application
模式进行提交应用。
67、yarn - session 提交流程详细介绍一下?
提交流程图如下:
1、启动集群
Flink Client
向Yarn ResourceManager
提交任务信息。Flink Client
将应用配置(Flink-conf.yaml
、logback.xml
、log4j.properties
)和相关文件(Flink Jar、配置类文件、用户 Jar 文件、JobGraph 对象等)上传至分布式存储 HDFS 中。Flink Client
向Yarn ResourceManager
提交任务信息。
- Yarn 启动 Flink 集群,做 2 2 2 步操作:
- 通过
Yarn Client
向Yarn ResourceManager
提交 Flink 创建集群的申请,Yarn ResourceManager
分配 Container 资源,并通知对应的NodeManager
上启动一个ApplicationMaster
(每提交一个 Flink Job 就会启动一个ApplicationMaster
),ApplicationMaster
会包含当前要启动的JobManager
和 Flink 自己内部要使用的ResourceManager
。 - 在
JobManager
进程中运行YarnSessionClusterEntryPoint
作为集群启动的入口。初始化Dispatcher
,Flink 自己内部要使用的ResourceManager
,启动相关 RPC 服务,等待Flink Client
通过 Rest 接口提交 JobGraph。
- 通过
2、作业提交
-
Flink Client
通过 Rest 向Dispatcher
提交编译好的 JobGraph。Dispatcher
是 Rest 接口,不负责实际的调度、指定工作。 -
Dispatcher
收到 JobGraph 后,为作业创建一个JobMaster
,将工作交给JobMaster
,JobMaster
负责作业调度,管理作业和 Task 的生命周期,构建 ExecutionGraph(JobGraph 的并行化版本,调度层最核心的数据结构)。
以上两步执行完后,作业进入调度执行阶段。
3、作业调度执行
-
JobMaster
向ResourceManager
申请资源,开始调度 ExecutionGraph。 -
ResourceManager
将资源请求加入等待队列,通过心跳向YarnResourceManager
申请新的 Container 来启动TaskManager
进程。 -
YarnResourceManager
启动,然后从 HDFS 加载 Jar 文件等所需相关资源,在容器中启动TaskManager
,TaskManager
启动TaskExecutor
。 -
TaskManager
启动后,向ResourceManager
注册,并把自己的 Slot 资源情况汇报给ResourceManager
。 -
ResourceManager
从等待队列取出 Slot 请求,向TaskManager
确认资源可用情况,并告知TaskManager
将 Slot 分配给哪个JobMaster
。 -
TaskManager
向JobMaster
回复自己的一个 Slot 属于你这个任务,JobMaser
会将 Slot 缓存到 SlotPool。 -
JobMaster
调度 Task 到TaskMnager
的 Slot 上执行。
68、yarn - per - job 提交流程详细介绍一下?
提交命令如下:
./bin/flink run -t yarn-per-job --detached xxx.jar
提交流程图如下所示:
1、启动集群
Flink Client
向Yarn ResourceManager
提交任务信息。Flink Client
将应用配置(Flink-conf.yaml
、logback.xml
、log4j.properties
)和相关文件(Flink Jar、配置类文件、用户 Jar 文件、JobGraph 对象等)上传至分布式存储 HDFS 中。Flink Client
向Yarn ResourceManager
提交任务信息。
- Yarn 启动 Flink 集群,做 2 2 2 步操作。
- 通过
Yarn Client
向Yarn ResourceManager
提交 Flink 创建集群的申请,Yarn ResourceManager
分配 Container 资源,并通知对应的NodeManager
上启动一个ApplicationMaster
(每提交一个 Flink Job 就会启动一个ApplicationMaster
),ApplicationMaster
会包含当前要启动的JobManager
和 Flink 自己内部要使用的ResourceManager
。 - 在
JobManager
进程中运行YarnJobClusterEntryPoint
作为集群启动的入口。初始化Dispatcher
,Flink 自己内部要使用的ResourceManager
,启动相关 RPC 服务,等待Flink Client
通过 Rest 接口提交 JobGraph。
- 通过
2、作业提交
ApplicationMaster
启动Dispatcher
,Dispatcher
启动ResourceManager
和JobMaster
(该步和 Session 不同,JobMaster
是由Dispatcher
拉起,而不是 Client 传过来的)。JobMaster
负责作业调度,管理作业和 Task 的生命周期,构建 ExecutionGraph(JobGraph 的并行化版本,调度层最核心的数据结构)。
以上两步执行完后,作业进入调度执行阶段。
3、作业调度执行
-
JobMaster
向ResourceManager
申请 Slot 资源,开始调度 ExecutionGraph。 -
ResourceManager
将资源请求加入等待队列,通过心跳向YarnResourceManager
申请新的 Container 来启动TaskManager
进程。 -
YarnResourceManager
启动,然后从 HDFS 加载 Jar 文件等所需相关资源,在容器中启动TaskManager
。 -
TaskManager
在内部启动TaskExecutor
。 -
TaskManager
启动后,向ResourceManager
注册,并把自己的 Slot 资源情况汇报给ResourceManager
。 -
ResourceManager
从等待队列取出 Slot 请求,向TaskManager
确认资源可用情况,并告知TaskManager
将 Slot 分配给哪个JobMaster
。 -
TaskManager
向JobMaster
回复自己的一个 Slot 属于你这个任务,JobMaser
会将 Slot 缓存到 SlotPool。 -
JobMaster
调度 Task 到TaskMnager
的 Slot 上执行。
相关文章:

【大数据】Flink 详解(六):源码篇 Ⅰ
Flink 详解(六):源码篇 Ⅰ 55、Flink 作业的提交流程?56、Flink 作业提交分为几种方式?57、Flink JobGraph 是在什么时候生成的?58、那在 JobGraph 提交集群之前都经历哪些过程?59、看你提到 Pi…...

ShardingSphere——弹性伸缩原理
摘要 支持自定义分片算法,减少数据伸缩及迁移时的业务影响,提供一站式的通用弹性伸缩解决方案,是 Apache ShardingSphere 弹性伸缩的主要设计目标。对于使用单数据库运行的系统来说,如何安全简单地将数据迁移至水平分片的数据库上…...

Linux项目自动化构建工具-make/Makefile
一、什么是make和makefile make是一条指令 Makefile是当前目录下的一个文件 二、makefile文件编写 依赖关系::前为要目标文件,后为其依赖的文件 依赖方法:用依赖文件生成目标文件的具体指令 简便写法: $:表示目标文件 $^:表示…...
Python爬虫实战:自动化数据采集与分析
在大数据时代,数据采集与分析已经成为了许多行业的核心竞争力。Python作为一门广泛应用的编程语言,拥有丰富的爬虫库,使得我们能够轻松实现自动化数据采集与分析。本文将通过一个简单的示例,带您了解如何使用Python进行爬虫实战。…...

视频智能分析平台EasyCVR安防视频汇聚平台助力森林公园防火安全的应用方案
一、研发背景 随着经济的发展和人们生活水平的提高,越来越多的人喜欢在周末去周边的森林公园旅游,享受大自然的美景,并进行野炊和烧烤等娱乐活动。然而,近年来由于烟蒂和烧烤碳渣等人为因素,森林公园火灾频繁发生。森…...

跨境做独立站,如何低成本引流?
大家都知道,海外的消费习惯与国内不同,独立站一向是海外消费者的最喜欢的购物方式之一,这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台,其他平台可以靠平台自身流量来获得转化,而独立站本身没有流…...

leetcode55.跳跃游戏 【贪心】
题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例…...

探秘C语言扫雷游戏实现技巧
本篇博客会讲解,如何使用C语言实现扫雷小游戏。 0.思路及准备工作 使用2个二维数组mine和show,分别来存储雷的位置信息和排查出来的雷的信息,前者隐藏,后者展示给玩家。假设盘面大小是99,这2个二维数组都要开大一圈…...
Leetcode112. 路径总和
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 t…...
生成12位短id,自增且不连续,永不重复,不依赖数据库
基本思路: 设计模式:单例模式 是否加锁:是 synchronized 获取最后一次生成的时间戳值T0 限定初始时间为2023-08-01 00:00:00,获取当前时间时间戳T1,T1与初始时间的毫秒差值T2,转为16进制,转为字符串为r1,获取该字符串的长度L1…...
Zip压缩文件夹php打包函数代码
Zip压缩文件夹php打包函数代码,Zip相关函数是PHP的扩展功能,此函数可以直接复制使用。 以下是代码: <?php # 将文件夹的文件压缩到文件里 class Zip {/*** 将目标文件夹下的内容压缩到zip中(zip包含文件夹目录)* @param $sourcePath *文件夹路径 例: /home/test* @p…...
RISC-V交叉工具链riscv-gnu-toolchain编译
文章目录 1、下载2、编译1. 依赖安装2. 编译 3、运行 1、下载 $ sudo apt-get install git wget build-essential $ git clone https://github.com/riscv-collab/riscv-gnu-toolchain $ git checkout 2023.06.02注意上面 clone 的仓库,我们称其为构建脚本仓库&…...

我能“C“——指针进阶(上)
目录 指针的概念 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 阅读两段有趣的代码&…...

SQLServer2008数据库还原失败 恢复失败
源地址:http://www.taodudu.cc/news/show-1609349.html?actiononClick 还原数据库问题解决方案 在还原数据库“Dsideal_school_db”时,有时会遇见上图中的问题“因为数据库正在使用,所以无法获得对数据库的独占访问权”,此时我们…...
【微服务部署】04-ForwardedHeaders
文章目录 1. ForwardedHeaders1.1 场景1.2 关键的HTTP头1.3 核心处理要点 1. ForwardedHeaders 1.1 场景 获取用户IP获取用户请求的原始URL 1.2 关键的HTTP头 X-Forwarded-ForX-Forwarded-ProtoX-Forwarded-Host 1.3 核心处理要点 设置PathBase设置ForwardedHeaders中间件…...

JVM 垃圾收集器
重点:CMS,G1,ZGC 主要垃圾收集器如下,图中标出了它们的工作区域、垃圾收集算法,以及配合关系。 Serial 收集器 Serial 收集器是最基础、历史最悠久的收集器。 如同它的名字(串行),…...
CSS 样式使用link和@import有什么区别
在页面导入样式时,使用link和import有以下区别: 位置:link标签可以放置在HTML文档的head或body中的任何位置,而import规则必须出现在CSS样式表的顶部。 加载方式:当浏览器解析到link标签时,会立即请求并加…...
LeetCode-2511-最多可以摧毁的敌人城堡数目
题目链接 代码实现: class Solution {/** 找 1 -> -1 的时候,经过0的最大个数* 解题思路:双指针*/public int captureForts(int[] forts) {int len forts.length;if(len1){return 0;}int max Integer.MIN_VALUE;boolean flag false;boo…...

iOS开发Swift-2-图片视图、App图标-赏月App
1.创建新项目 点击File - New - Project。 选择Single View App,点击Next。 填写文件信息,点击Next。 选择文件位置,点击Create。 修改App显示名称为 “赏月”。 2.设置背景色 选择Main,点击View界面,选择右边属性&…...
node18 vue2启动报错 error:0308010C:digital envelope routines::unsupported
出现原因 貌似是因为是因为 node 17版本开始发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响。 解决方法 第一种方法降低node版本 降低到17以下即可 ,如项目不能降低版本 看后面的解决方式 第二…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...