【大数据】Flink 详解(六):源码篇 Ⅰ

news2024/11/19 13:36:24

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.coloradmin.cn/o/962080.html

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

相关文章

命令执行漏洞复现攻击:识别威胁并加强安全

环境准备 这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。 一、攻击相关介绍 原理 主要是输入验证不严格、代码逻辑错误、应用程序或系统中缺少安全机制等。攻击者可以通过构造特定的输入向应用程序或系统注入恶意代码&#xff…

sql:SQL优化知识点记录(七)

(1)索引优化5 (2)索引优化6 (3)索引优化7 查询*, 百分号加右边,否则索引会失效 没建立索引之前都是全表扫描 没建立索引 建立索引: 建立索引 id是主键,他也…

零信任安全模型详解:探讨零信任安全策略的原理、实施方法和最佳实践,确保在网络中实现最小特权原则

在当今日益复杂和危险的网络环境中,传统的网络安全模型已经不再能够满足对抗不断进化的威胁。零信任安全模型应运而生,以其强调“不信任,始终验证”的理念,成为了当今信息技术领域中的热门话题。本文将深入探讨零信任安全模型&…

(leetcode802,拓扑排序,深搜+三色标记)-------------------Java实现

(leetcode802,拓扑排序,深搜三色标记)找到最终的安全状态-------------------Java实现 题目表述 有一个有 n 个节点的有向图,节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示,…

【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

文章目录 RPC 协议gRPCJSON-RPC 数据序列化与反序列化lua-cjsonlua-protobuf RPC 协议 在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调…

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 目录 Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 一、简单介绍 二、OKHttp 4.xx 的 SDK 封装 aar 给 Unity 的使用注意 三、附录 OKHttp 的…

一米ip流量池系统

PC端快速切换移动网络IP 支持全网通sim卡槽,国内三大运营商IP池动态切换,实现真实移动端IP切换。从此换IP再也不用vpn或代理,一个设备搞定 1.兼容国内电信,移动,联通三网通的sim卡4G连接,快速稳定2.可直接…

《算法竞赛·快冲300题》每日一题:“简化农场”

《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 简…

SpringBoot自定义消息总线

一、前言 在现代的分布式系统中,消息传递已成为一个非常流行的模式。它使得系统内的不同部分可以松耦合地通信,从而实现更高效、更可靠的应用程序。本博客将介绍SpringBoot如何提供简单易用的消息传递机制,并展示如何自定义消息总线以满足特定…

安装使用 d3graph 时出现 TypeError 的解决方法

使用 python 3.7 pip 22.3.1 在清华镜像源 https://pypi.tuna.tsinghua.edu.cn/simple 安装 d3blocks 1.3.2 时,安装成功后导入包时出错: 观察报错信息可以看到出错的代码(902 行)使用了类型指定语法,这是最新的 pyth…

stable diffusion实践操作-电脑硬件查看

本文专门开一节写电脑硬件相关的内容,在看之前,可以同步关注: stable diffusion实践操作 正文 1、检查电脑显存的方法(win10): 鼠标放在工具栏,单击右键打开“任务管理器”,选择顶…

jmeter 固定定时器

固定定时器(Constant Timer)是一个定时器元件,可以在线程组中的每个线程之间添加固定的延迟时间。固定定时器会对每个线程的执行进行一定的暂停。 聊一下和线程组中的调度器对线程组执行时长的影响: 相同: 都会影响线…

【线性代数】矩阵求导的本质与分子布局、分母布局的本质(矩阵求导——本质篇)

矩阵求导的本质与分子布局、分母布局的本质(矩阵求导——本质篇) 说在前面一. 函数与标量、向量、矩阵二. 矩阵求导的本质三. 矩阵求导结果的布局四. 分子布局、分母布局的本质五. 向量变元的实值标量函数 说在前面 我将严谨地说明矩阵求导的本质与分子布…

游戏思考30(补充版):关于逆水寒铁牢关副本、白石副本和技能的一些注释(2023/0902)

前期介绍 我是一名逆水寒的玩家,做一些游戏的笔记当作攻略记录下来,荣光不朽-帝霸来源视频连接 传送门 一、旧版铁牢关(非逆水寒老兵服) (1)老一:巨鹰 1)机制一:三阵风…

多通道振弦数据记录仪应用桥梁安全监测的关键要点

多通道振弦数据记录仪应用桥梁安全监测的关键要点 随着近年来桥梁建设和维护的不断推进,桥梁安全监测越来越成为公共关注的焦点。多通道振弦数据记录仪因其高效、准确的数据采集和处理能力,已经成为桥梁安全监测中不可或缺的设备。本文将从以下几个方面…

JavaScript基础02

JavaScript 基础 文章目录 JavaScript 基础运算符算术运算符赋值运算符自增/自减运算符比较运算符逻辑运算符运算符优先级 语句表达式和语句分支语句if 分支语句if双分支语句if 多分支语句三元运算符(三元表达式)switch语句(了解)…

孙哥Spring源码第16集

第16集 refresh()-prepareBeanFactory分析 【视频来源于:B站up主孙帅suns Spring源码视频】 1、设置类加载器 2、设置SpringEL表达式 解析器 3、设置内置的属性编辑器 (类型转换器) 3.1、如何实现类型转化? 1、Converter 2、P…

Ubuntu 20.04 Server配置网络

0,环境 服务器: Intel(R) Xeon(R) Gold 6248R CPU 3.00GHz 96核 网卡: 多网卡 1, 镜像下载 http://old-releases.ubuntu.com/releases/ubuntu-20.04.1-desktop-amd64.iso 2, 系统安装--具体步骤就不贴出来&#…

Navicat 强大的数据模型功能 | 面向数据库设计、架构和数据资产梳理等使用场景

数据模型是用来描述数据、组织数据和对数据进行操作的一组概念和定义。根据不同的应用需求,数据模型可以分为概念模型、逻辑模型和物理模型。这些数据模型帮助数据库设计人员设计和管理数据库,以满足用户的需求。 Navicat 强大的数据模型功能主要适用于…

Linux c++开发-03-使用CMake组织工程

一、简单文件的编译 有如下的目录结构&#xff1a; 其中 helloworld.cpp如下&#xff1a; #include <iostream> using namespace std; int main() {printf("hello world my name is Ty!");return 0; }CMakeLists.txt如下&#xff1a; cmake_minimum_requir…