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

2023-11-13

本系列包含:


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 上执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【大数据】Flink 详解(六):源码篇 Ⅰ 的相关文章

随机推荐

  • 小白都能看懂 XAMPP的下载安装配置详细教程(含拒绝访问坑)

    话不相瞒 当初为了在XAMPP Apache MySQL PHP PERL 里面配置phpwind 我在卸载与安装之间来回了不下10次 但是我的phpwind始终还是安装不成功 我可能是招坑体质 真的很无奈 最终 我放弃了phpwind 废
  • openmv串口打包发送数据

    openmv端 import time from pyb import UART import ustruct uart UART 3 19200 uart init 19200 8 None 1 def send data d globa
  • hadoop搭建及常见问题

    这是本人在完全分布式环境下在Cent OS中配置Hadoop 0 20 203 0时的总结文档 但该文档也适合其他版本的Linux系统和目前各版本的Hadoop Hadoop 0 20之后的版本配置文件hadoop site xml被拆分成
  • 使用Python,OpenCV对图像进行亚像素点检测,并拟合椭圆进行绘制

    这篇博客将介绍如何使用Python OpenCV对图像进行亚像素检测 并对亚像素点进行椭圆拟合绘制 1 效果图 原始图上绘制拟合椭圆 VS 原始图上绘制拟合椭圆及亚像素点绘制随机半径及颜色的圆 VS 灰度图上绘制亚像素点效果图如下 我喜欢的
  • 安装 mysqlclient==1.3.12 报错:OSError: mysql_config not found

    安装 mysqlclient 1 3 12 报错 OSError mysql config not found Collecting mysqlclient 1 3 12 Using cached mysqlclient 1 3 12 ta
  • 【Mo 人工智能技术博客】时间序列预测——DA-RNN模型

    时间序列预测 DA RNN模型 作者 梅昊铭 1 背景介绍 传统的用于时间序列预测的非线性自回归模型 NRAX 很难捕捉到一段较长的时间内的数据间的时间相关性并选择相应的驱动数据来进行预测 本文将介绍一种基于 Seq2Seq 模型 Enco
  • 在centos7安装anaconda3操作手册

    一 Anaconda下载 进入anaconda官方网站下载个人免费版本 网站链接 点击download 选择Linux平台的安装包 二 Anaconda安装 1 执行如下指令 安装anaconda 进入当保存文件的目录 执行此指令 后期由于
  • Jina AI‘2021

    2022 农历新年进入倒数阶段 回望 2021 因为有了社区和开发者们的支持和助力 Jina AI 从产品 社区 到用户案例及团队 都取得了一些相当哇塞的成就 接下来 我们就一起来重温一下 2021 年 Jina AI 的惊喜变化 领取 J
  • 第十一天栈与队列

    20 有效的括号 力扣题目链接 opens new window 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 题外话 括号匹
  • opencv项目实践一(答题卡识别)

    答题卡素材图片 思路 读入图片 做一些预处理工作 进行轮廓检测 然后找到该图片最大的轮廓 就是答题卡部分 进行透视变换 以去除除答题卡外的多于部分 并且可以对答题卡进行校正 再次检测轮廓 定位每个选项 对选项圆圈先按照竖坐标排序 再按照行坐
  • 十进制有符号小数转换成二进制数的实现_Matlab实现_归一化处理

    在一些数据处理过程中 需要将一组十进制小数转换成二进制数存储或者计算 这种操作在FPGA的使用中会经常遇到 本文分析了十进制小数转换成二进制数的方法 1 N位二进制数的取值范围 N位无符号型 unsigned 取值范围 2 N 1 0 可以
  • Java中守护线程的总结 thread.setDaemon(true)

    https www cnblogs com ziq711 p 8228255 html 在Java中有两类线程 User Thread 用户线程 Daemon Thread 守护线程 用个比较通俗的比如 任何一个守护线程都是整个JVM中所有
  • 服务器windows系统数据盘不显示不出来,解决云主机没有显示数据盘的问题

    随着网络的发展 越来越多的站长与企业都在使用云主机 但是目前由于云主机的尚未成熟 所有大家在使用过程中经常会遇到使用方面的问题 下面我们总结了下有关云主机重装或者初建时数据盘不见的问题做了解说 希望对大家有所帮助 经常会有用户询问 我们的云
  • R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

    最近我们被客户要求撰写关于卷积神经网络的研究报告 包括一些图形和统计输出 在本文中 我们将学习如何使用keras 用手写数字图像数据集 即MNIST 进行深度学习 本文的目的是为了让大家亲身体验并熟悉培训课程中的神经网络部分 1 软件包的下
  • Vue-cli安装文档及使用(搭建vue-cli、nodejs、webpack架子)

    之前学习基础语法 todolist 所有的代码写在index html之中 大型项目不可维护 在真实vue项目开发过程中 会借助webpack打包工具帮助构建大型项目开发目录 再开发完成之后进行打包的操作 帮助生成线上可运行的代码 如果让每
  • 树莓派教程 - 1.5 树莓派GPIO库wiringPi 使用硬件串口ttyAMA0与ttyS0

    Git例程源码仓库 https github com ZhiliangMa raspberry git 上一篇介绍 ttyS0串口的用法 说到了此串口利弊 可能会出现乱码 但绝对能满足绝大部分的要求 本节使用 dev ttyAMA0 的方法
  • CentOS7 安装配置FTP服务器的问题

    C C 气象数据中心实战工业级项目系列 第三章 CentOS7 安装配置FTP服务器的问题 文章目录 C C 气象数据中心实战工业级项目系列 一 参考 二 设置 data ftp ftpuser upload目录 代表着只能在这个目录中上传
  • mysql in和exists性能比较和使用

    in 是把外表和内表作hash 连接 而exists是对外表作loop循环 每次loop循环再对内表进行查询 一直以来认为exists比in效率高的说法是不准确的 如果查询的两个表大小相当 那么用in和exists差别不大 如果两个表中一个
  • 【Redis入门】-浅谈redis事务

    说到事务大家都不陌生 在关系型数据库中 事务时并发控制的基本单位 他是一个操作的序列 可以包含多个指令 并且 对于一个事务 其内部的指令要么全部执行 要么都不执行 内部指令不可分割 关系型数据库的事务具有四个特性 1 原子性 2 一致性 3
  • 【大数据】Flink 详解(六):源码篇 Ⅰ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇