【大数据】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.rhkb.cn/news/115977.html

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

相关文章

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉! 7月份,打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知,当月京东平台打印机的销量为48万,环比下降约28%,同比下降约18%;销售额为4亿,环…

【云原生】Kubernetes容器编排工具

目录 1. K8S介绍 1.1 k8s的由来 下载地址 1.2 docker编排与k8s编排相比 1.3 传统后端部署与k8s 的对比 传统部署 k8s部署 ​2. k8s的集群架构与组件 (1) Kube-apiserver (2)Kube-controller-manager (3&a…

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第三、四节:几何表述和形状描述

文章目录 一:几何描述(1)像素间几何关系A:邻接与连通B:距离 (2)像素间几何特征A:位置B:方向C:尺寸 (3)程序 二:形状描述&a…

SPI3+DMA外设驱动-TFTLCD初始化

前言 (1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。 (2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片…

13.动态渲染侧边栏

为什么要动态渲染? 比如我们现在需要以下侧边栏的数据: 如果一个个的去写标签会很麻烦,发现导航栏中的数据分为两类,一类是一级导航,另一位是二级导航(有子页),因此直接写两个函数判…

ClickHouse进阶(六):副本与分片-2-Distributed引擎

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅…

如何使用SQL系列 之 了解SQL中的约束规则

简介 在设计数据库时,有时可能需要对某些列中允许的数据设置限制。例如,如果你要创建一张表来保存摩天大楼的信息,你可能希望在保存每座大楼高度的列中禁止使用负值。 关系型数据库管理系统(RDBMS)允许你使用约束来控制哪些数据被添加到表中…

Spring Boot源码解读与原理剖析:深入探索Java开发的奥秘!

评论区留言赠书15本 关注点赞评论,评论区回复“Spring Boot源码解读与原理剖析:深入探索Java开发的奥秘!” 每篇最多评论3条!!采用抽奖助手自动拉取评论区有效评论送书两本, 开奖时间:9月11号 承…

MySQL数据库——多表查询(3)-自连接、联合查询、子查询

目录 自连接 查询语法 自连接演示 联合查询 查询语法 子查询 介绍 标量子查询 列子查询 行子查询 表子查询 自连接 通过前面的学习,我们对于连接已经有了一定的理解。而自连接,通俗地去理解就是自己连接自己,即一张表查询多次。…

二进制数的位运算(非和异或)invert()和bitwise_xor()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 二进制数的位运算(非和异或) invert()和bitwise_xor() [太阳]选择题 下列代码最后一次输出的结果是? import numpy as np a, b 3, 10 print("【执行】np.binary_repr(a, 4)…

vue3+ts组件通信

1、父组件向组件传参 父组件代码 子组件代码 2、子组件向父组件传参 组件间代码 父组件代码 3、如果eslint报错,需在.eslintrc.js中添加一行代码 4、通过父组件通过 ref 获取子组件的属性或者方法 父组件代码 子组件代码 5、孙子组件provide和inject 父组件…

再也不信能用99年的IDEA激活方式了

今天给大家安利一款IDEA伴侣神器 Toolbox,开发必备的IDEA大家都在用,但很多小伙伴没用过Toolbox。 介绍 为什么使用 JetBrains Toolbox? 包含超过 15 款可用于专业开发的工具。 每个工具专门针对其技术开发。 所有工具都会定期更新&#…

python 笔记(3)——request、爬虫、socket、多线程

目录 1、使用requests发送http请求 1-1)发送get请求 1-2)发送 post 请求 1-3)发送 get 请求下载网络图片 1-4)使用 post 上传文件 1-5)自动维护 session 的方式 2、使用 os.popen 执行cmd命令 3、基于 beautif…

卷积神经网络实现运动鞋识别 - P5

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:Pytorch实战 | 第P5周:运动鞋识别🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 目录…

沐风老师3DMAX厨房橱柜生成器KitchenCabinetGenerator教程

3DMAX厨房橱柜生成器插件使用方法 3DMAX橱柜生成器KitchenCabinetGenerator是一个在3dMax中自动创建三维橱柜模型的高效脚本。它有多种风格的台面、门和橱柜,可以灵活地应用于Archviz项目,同时为3D艺术家节省大量时间。 【适用版本】 1.3dMax2018 – 20…

YOLO数据集划分(训练集、验证集、测试集)

1.将训练集、验证集、测试集按照7:2:1随机划分 1.项目准备 1.在项目下新建一个py文件,名字就叫做splitDataset1.py 2.将自己需要划分的原数据集就放在项目文件夹下面 以我的为例,我的原数据集名字叫做hatDataXml 里面的JPEGImages装的是图片 Annota…

设计模式-适配器

文章目录 一、简介二、适配器模式基础1. 适配器模式定义与分类2. 适配器模式的作用与优势3.UML图 三、适配器模式实现方式1. 类适配器模式2. 对象适配器模式3.类适配器模式和对象适配器模式对比 四、适配器模式应用场景1. 继承与接口的适配2. 跨平台适配 五、适配器模式与其他设…

C++之std::distance应用实例(一百八十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

论文解读 | 三维点云深度学习的综述

原创 | 文 BFT机器人 KITTI 是作为基准测试是自动驾驶中最具影响力的数据集之一,在学术界和工业界都被广泛使用。现有的三维对象检测器存在着两个限制。第一是现有方法的远程检测能力相对较差。其次,如何充分利用图像中的纹理信息仍然是一个开放性的问题…

uniapp授权小程序隐私弹窗效果demo(整理)

9月15号前要配置这句话 "__usePrivacyCheck__": true,官方“小程序隐私协议开发指南”文档 <template> <view class"dealBox"><view class"txtBox padding10"><!-- 查看协议 -->在您使用施工现场五星计划小程序之前&am…