【大数据】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 的调用可以转为 StreamGraphJobGraphExecutionGraph

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 方法,然后交给 PipelineExecuteorexecute 方法,最终根据提交的模式选择触发一个具体的 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 中的其中一个作业执行完成后,释放了资源,下个作业才会正常提交。所有作业共享 DispatcherResourceManager,共享资源,适合规模小执行时间短的作业。

在这里插入图片描述

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 申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享 DispatcherResourceManager,按需接受资源申请。适合规模大长时间运行的作业。

在这里插入图片描述

66、yarn - application 模式特点?

提交命令如下:

./bin/flink run-application -t yarn-application xxx.jar

yarn-application 模式:每个作业单独启动集群,隔离性好,JM 负载均衡,main 方法在 JobManager 上执行。

yarn-per-jobyarn-session 模式下,客户端都需要执行以下三步,即:

  • 获取作业所需的依赖项;
  • 通过执行环境分析并取得逻辑计划,即 StreamGraphJobGraph
  • 将依赖项和 JobGraph 上传到集群中。

在这里插入图片描述
只有在这些都完成之后,才会通过 env.execute() 方法触发 Flink 运行时真正地开始执行作业。如果所有用户都在同一个客户端上提交作业,较大的依赖会消耗更多的带宽,而较复杂的作业逻辑翻译成 JobGraph 也需要吃掉更多的 CPU 和内存,客户端的资源反而会成为瓶颈。

为了解决它,社区在传统部署模式的基础上实现了 Application 模式。原本需要客户端做的三件事被转移到了 JobManager 里,也就是说 main() 方法在集群中执行(入口点位于 ApplicationClusterEntryPoint),客户端只需要负责发起部署请求了。

在这里插入图片描述
综上所述,Flink 社区比较推荐使用 yarn-per-job 或者 yarn-application 模式进行提交应用。

67、yarn - session 提交流程详细介绍一下?

提交流程图如下:

在这里插入图片描述

1、启动集群

  • Flink ClientYarn ResourceManager 提交任务信息。
    • Flink Client 将应用配置(Flink-conf.yamllogback.xmllog4j.properties)和相关文件(Flink Jar、配置类文件、用户 Jar 文件、JobGraph 对象等)上传至分布式存储 HDFS 中。
    • Flink ClientYarn ResourceManager 提交任务信息。
  • Yarn 启动 Flink 集群,做 2 2 2 步操作:
    • 通过 Yarn ClientYarn 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,将工作交给 JobMasterJobMaster 负责作业调度,管理作业和 Task 的生命周期,构建 ExecutionGraph(JobGraph 的并行化版本,调度层最核心的数据结构)。

以上两步执行完后,作业进入调度执行阶段。

3、作业调度执行

  • JobMasterResourceManager 申请资源,开始调度 ExecutionGraph。

  • ResourceManager 将资源请求加入等待队列,通过心跳向 YarnResourceManager 申请新的 Container 来启动 TaskManager 进程。

  • YarnResourceManager 启动,然后从 HDFS 加载 Jar 文件等所需相关资源,在容器中启动 TaskManagerTaskManager 启动 TaskExecutor

  • TaskManager 启动后,向 ResourceManager 注册,并把自己的 Slot 资源情况汇报给 ResourceManager

  • ResourceManager 从等待队列取出 Slot 请求,向 TaskManager 确认资源可用情况,并告知 TaskManager 将 Slot 分配给哪个 JobMaster

  • TaskManagerJobMaster 回复自己的一个 Slot 属于你这个任务,JobMaser 会将 Slot 缓存到 SlotPool。

  • JobMaster 调度 Task 到 TaskMnager 的 Slot 上执行。

68、yarn - per - job 提交流程详细介绍一下?

提交命令如下:

./bin/flink run -t yarn-per-job --detached xxx.jar

提交流程图如下所示:

在这里插入图片描述
1、启动集群

  • Flink ClientYarn ResourceManager 提交任务信息。
    • Flink Client 将应用配置(Flink-conf.yamllogback.xmllog4j.properties)和相关文件(Flink Jar、配置类文件、用户 Jar 文件、JobGraph 对象等)上传至分布式存储 HDFS 中。
    • Flink ClientYarn ResourceManager 提交任务信息。
  • Yarn 启动 Flink 集群,做 2 2 2 步操作。
    • 通过 Yarn ClientYarn 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 启动 DispatcherDispatcher 启动 ResourceManagerJobMaster(该步和 Session 不同,JobMaster 是由 Dispatcher 拉起,而不是 Client 传过来的)。JobMaster 负责作业调度,管理作业和 Task 的生命周期,构建 ExecutionGraph(JobGraph 的并行化版本,调度层最核心的数据结构)。

以上两步执行完后,作业进入调度执行阶段。

3、作业调度执行

  • JobMasterResourceManager 申请 Slot 资源,开始调度 ExecutionGraph。

  • ResourceManager 将资源请求加入等待队列,通过心跳向 YarnResourceManager 申请新的 Container 来启动 TaskManager 进程。

  • YarnResourceManager 启动,然后从 HDFS 加载 Jar 文件等所需相关资源,在容器中启动 TaskManager

  • TaskManager 在内部启动 TaskExecutor

  • TaskManager 启动后,向 ResourceManager 注册,并把自己的 Slot 资源情况汇报给 ResourceManager

  • ResourceManager 从等待队列取出 Slot 请求,向 TaskManager 确认资源可用情况,并告知 TaskManager 将 Slot 分配给哪个 JobMaster

  • TaskManagerJobMaster 回复自己的一个 Slot 属于你这个任务,JobMaser 会将 Slot 缓存到 SlotPool。

  • JobMaster 调度 Task 到 TaskMnager 的 Slot 上执行。

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

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

相关文章

【个人博客系统网站】统一处理 · 拦截器

【JavaEE】进阶 个人博客系统(2) 文章目录 【JavaEE】进阶 个人博客系统(2)1. 统一返回格式处理1.1 统一返回类common.CommonResult1.2 统一返回处理器component.ResponseAdvice 2. 统一异常处理3. 拦截器实现3.1 全局变量SESSI…

Kitchen Hook

双扛厨房排钩:挂刀具

低代码赋能| 绿色智慧矿山解决方案

在世界能源日趋紧张的背景下,能源产业的数字化升级是大势所趋。矿山行业作为国家能源安全的“压舱石”,也必须进行产业升级。一直以来,国家都在大力推动智慧矿山建设。通过大数据、GIS、物联网、云计算、人工智能等新兴技术,实现矿…

Swift 技术 视频播放器滚动条(源码)

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络&#xff0…

云计算 - 百度AIStudio使用小结

云计算 - 百度AIStudio使用小结 前言 本文以ffmpeg处理视频为例,小结一下AI Studio的使用体验及一些避坑技巧。 算力获得 免费的算力获得方式为:每日登录后运行一个项目(只需要点击运行,不需要真正运行)即可获得8小…

深入理解 JVM 之——动手编译 JDK

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 本篇为深入理解 Java 虚拟机第一章的实战内容,推荐在学习前先掌握基础的 Linux 操作、编译原理基础以及扎实的 C/C 功底。 该系列的 GitHub 仓库:https://github.com/Doge2077/lear…

Python爬虫网络安全:优劣势和适用范围分析

目录 优势和劣势 优势: 劣势: 适用范围: 1. 网页数据收集和分析: 2. 漏洞扫描和安全评估: 3. 威胁情报收集: 4. 社交媒体监测和情感分析: 注意事项 1. 合规性和法律规定: …

VB.NET 如何将某个Excel的工作表中复制到另一个的Excel中的工作表中https://bbs.csdn.net/topics/392861034

参考http://share.freesion.com/306372/可以实现直接拷贝指定表 Private Sub Excel复制工作簿()Dim myExcelApp As New Microsoft.Office.Interop.Excel.ApplicationmyExcelApp.Workbooks.Open(System.Environment.CurrentDirectory "\\测试用例.xlsx", Type.Missin…

深入浅出理解Allan方差分析方法

一、参考资料 深入浅出理解卡尔曼滤波 二、Allan方差分析方法 1. 引言 传统的误差指标往往是采用均值误差(反映整个误差序列有无宏观偏置)、标准差(反映整个误差序列的波动情况),以及均方根(RMS&#x…

怎样来实现流量削峰方案

削峰从本质上来说就是更多地延缓用户请求,以及层层过滤用户的访问需求,遵从“最后落地到数据库的请求数要尽量少”的原则。 1.消息队列解决削峰 要对流量进行削峰,最容易想到的解决方案就是用消息队列来缓冲瞬时流量,把同步的直…

uview ui 1.x ActonSheet项太多,设置滚动(亲测有效)

问题:ActionSheet滚动不了。 使用uview ui :u-action-sheet, 但是item太多,超出屏幕了, 查了一下文档,并没有设置滚动的地方。 官方文档:ActionSheet 操作菜单 | uView - 多平台快速开发的UI框架 - uni-a…

Spring Cloud--从零开始搭建微服务基础环境【三】

😀前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【三】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,…

使用Fiddler模拟网络

Fiddler已经预置提供了模拟Modem速度的选项,其位置位于: Rules->Performances->Simulate Modem Speeds 勾选该选项后,所有通过Fiddler代理的流量都会变得用56k modem上网一般。 要直观观察限速后的效果,最好使用运行在浏览…

Linux用一键安装包部署禅道(18.5版本)

一、安装 禅道软件下载地址:禅道官方下载地址 - 禅道开源项目管理软件 - 禅道开源项目管理软件 请根据自己的需要下载对应的版本。 官方教程地址: (推荐)Linux用一键安装包 - 禅道使用手册 - 禅道开源项目管理软件 注:Linux 一键安装包必须直接解压到 …

2023-9-3 分解质因数

题目链接&#xff1a;分解质因数 #include <iostream>using namespace std;void divide(int n) {for(int i 2; i < n / i; i ){if(n % i 0){int res 0;while(n % i 0){n / i;res ;}cout << i << << res << endl;}}if(n > 1) cout &l…

linux 内存一致性

linux 出现内存一致性的场景 1、编译器优化 &#xff0c;代码上下没有关联的时候&#xff0c;因为编译优化&#xff0c;会有执行执行顺序不一致的问题&#xff08;多核单核都会出现&#xff09; 2、多核cpu乱序执行&#xff0c;cpu的乱序执行导致内存不一致&#xff08;多核出…

匠心新品:大彩科技超薄7寸WIFI线控器发布,热泵、温控器、智能家电首选!

一、产品介绍 此次发布一款7寸高清全新外壳产品&#xff0c;让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动&#xff1a; 1 表面玻璃盖板使用2.5D立体结构&#xff1b; 2 液晶盖板采用一体黑设计&#xff0c;且液晶屏与触摸板是全贴合结构&#xff1b; …

卡片介绍、EMV卡组织、金融认证---安全行业基础篇2

一、卡片介绍 卡片是一种用于存储和传输数据的可携带式物品&#xff0c;通常由塑料或纸质材料制成。卡片通常具有特定的尺寸和形状&#xff0c;以适应各类读写设备。不同类型的卡片可以用于不同的应用&#xff0c;如身份验证、支付、门禁控制等。 接触卡 接触卡是一种需要与读…

SpringBoot 整合 RabbitMQ

1. 创建 SpringBoot 工程 把版本改为 2.7.14 引入这两个依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springfr…

【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《C语言进阶》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1.如何写出好的代码&#xff1f;1.2 如何分析一个函数写的怎么样 2. 代码板式的重要性2.1 代码…