YARN运行流程源码分析

news2024/11/26 10:05:27
一、yarn任务执行流程图

在这里插入图片描述
在分析任务之前先走一下yarn内部的流程细节。

二、RM 内部处理提交阶段运行流程

如上图流程所示:
1.client 提交任务给yarn,yarn 这边会获取任务的AM相关资源,client在提交阶段会上传job.split (数据切分,相应的map数量), job.xml (配置相关)等信息,以及认证信息,封装成AM启动的资源,AM启动过程会去下载。
在这里插入图片描述
接下来会执行 rmAppManager.submitApplication ,内部调用createAndPopulateNewRMApp ,yarn内部会创建一个RMAppImpl内存对象,并维护在内存中。这里会判断是否是CS调度器,如果是CS调度器还会检查用户是否有队列提交权限。
在这里插入图片描述
并且做初始的认证工作,并renew token ,并触发一个RMAppEvent事件,时间类型 RMAppEventType.START。
在这里插入图片描述
2.上面这个start事件会通过RM第一层的异步事件分发器进行分发:如下8种事件类型对应8种事件处理器。RMAppEventType 对应 ApplicationEventDispatcher 处理器,这个事件处理器也是一个事件分发器,进行第二次转发。
在这里插入图片描述
scheduler.event.SchedulerEventType" -> {EventDispatcher@8556} "Service SchedulerEventDispatcher rmapp.RMAppEventType" -> {ResourceManager$ApplicationEventDispatcher@8557} rmapp.attempt.RMAppAttemptEventType" -> {AsyncDispatcher$MultiListenerHandler@8558} rmnode.RMNodeEventType" -> {ResourceManager$NodeEventDispatcher@8559} RMFatalEventType" -> {ResourceManager$RMFatalEventDispatcher@8560} RMAppManagerEventType" -> {RMAppManager@8561} NodesListManagerEventType" -> {NodesListManager@8562} "Service NodesListManager amlauncher.AMLauncherEventType" -> {ApplicationMasterLauncher@8563} "Service ApplicationMasterLauncher
3. 经过上面这层转发,调用的是刚刚创建的 RMAppImpl handle方法。RMAppImpl 本身维护了一个状态机,根据当前状态调用相应的状态转换方法。此时 调用该状态转换过程:

Transition(RMAppState.NEW, RMAppState.NEW_SAVING, RMAppEventType.START, new RMAppNewlySavingTransition()) ,执行 RMAppNewlySavingTransition.transition 方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.上面方法会将app相关提交信息持久化,以便于恢复,这一步也会产生一个事件 :RMStateStoreAppEvent,事件类型:RMStateStoreEventType.STORE_APP,该事件会进入RMStateStore 的 AsyncDispatcher 事件分发器,

dispatcher = new AsyncDispatcher("RM StateStore dispatcher");
dispatcher.init(conf);
rmStateStoreEventHandler = new ForwardingEventHandler();
dispatcher.register(RMStateStoreEventType.class,  rmStateStoreEventHandler);

最终会调用 ForwardingEventHandler 的handle方法。
RMStateStore 的 Transition(RMStateStoreState.ACTIVE,EnumSet.of(RMStateStoreState.ACTIVE, RMStateStoreState.FENCED), RMStateStoreEventType.STORE_APP, new StoreAppTransition())
StoreAppTransition.transition 方法。 存储完app信息,产生RMAppEvent 事件,事件类型 RMAppEventType.APP_NEW_SAVED。
在这里插入图片描述
这个事件会进入第一层事件分发器 rmDispatcher , 最终会执行RMAppImpl 的状态转换方法,此时app 状态 APP_NEW_SAVED 。
在这里插入图片描述
HADOOP-878 输出Application Report信息到本地磁盘 任务监控的数据逻辑如下框所示,所以说,只有在改app有相关事件处理时,才会记录app运行状态的数据。
在这里插入图片描述
根据这个事件类型 ,就会进行app的调度执行 :Transition(RMAppState.NEW_SAVING, RMAppState.SUBMITTED, RMAppEventType.APP_NEW_SAVED, new AddApplicationToSchedulerTransition())
在这里插入图片描述
AddApplicationToSchedulerTransition 直接产生 AppAddedSchedulerEvent 这个事件,事件类型:SchedulerEventType.APP_ADDED 。这个事件也会进入到第一层的事件分发器,根据上面的8种事件类型,最终 EventDispatcher 内部handler :ResourceScheduler 进行处理。
CS 与 FS 调度器提交到队列的流程基本一致,区别看后面的分配流程,队列监控组件会添加到内部内存对象里,同时会在调度器内部构建一个调度的app 对象SchedulerApplication。
判断相应的队列 ,以及队列的提交权限,都符合,就会getMetrics 增加提交的应用,并产生 RMAppEvent ,事件类型:RMAppEventType.APP_ACCEPTED 。
Transition(RMAppState.SUBMITTED, RMAppState.ACCEPTED, RMAppEventType.APP_ACCEPTED, new StartAppAttemptTransition())
在这里插入图片描述
在这里插入图片描述
StartAppAttemptTransition.transition 会创建 RMAppAttemptImpl ,维护在当前 RMAppImpl 内,后续如果有重试,就会产生多个。 并且会产生 RMAppStartAttemptEvent 事件 ,事件类型 :RMAppAttemptEventType.START 。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ApplicationAttemptEventDispatcher 处理,最终调用 RMAppAttemptImpl 的handle。 RMAppAttemptImpl 也维护了一个状态机。 根据事件类型,执行的是这个转换过程:
Transition(RMAppAttemptState.NEW, RMAppAttemptState.SUBMITTED, RMAppAttemptEventType.START, new AttemptStartedTransition())
AttemptStartedTransition.transition . 此时会注册 到内部
appAttempt.masterService.registerAppAttempt(appAttempt.applicationAttemptId);
并会 产生 AppAttemptAddedSchedulerEvent 事件,事件类型:SchedulerEventType.APP_ATTEMPT_ADDED。
在这里插入图片描述
在这里插入图片描述
FairScheduler handle

FSLeafQueue queue = (FSLeafQueue) application.getQueue();
queue.addApp(attempt, runnable);
if (runnable) {
  runnableApps.add(app);
} else {
  nonRunnableApps.add(app);
}
incUsedResource(app.getResourceUsage());

产生 RMAppAttemptEvent事件,事件类型:RMAppAttemptEventType.ATTEMPT_ADDED
Transition(RMAppAttemptState.SUBMITTED,
EnumSet.of(RMAppAttemptState.LAUNCHED_UNMANAGED_SAVING,
RMAppAttemptState.SCHEDULED),
RMAppAttemptEventType.ATTEMPT_ADDED,
new ScheduleTransition())

ScheduleTransition.transition 进行 AM资源的申请
在这里插入图片描述
这里会调用具体的调度器进行处理,这里面就会更新 CS 调度器内部维护的app 等待被调度的资源。
在这里插入图片描述
具体看看修改的内存对象
在这里插入图片描述
到此为止,RM 内部处理提交阶段的流程走完了。后面就是NM RM心跳交互触发调度的流程。

三、NM 与 RM 心跳流程

在分析RM 与NM 心跳流程前,先看看经过RM处理提交阶段后RM内存内部关键的内存对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
RM本身会维护一个Application的对象RMAppimpl, 可以看到CS调度器内存中维护一个调度的app SchedulerApplication对象 , 这个SchedulerApplication等待的资源是 memory:2048 , Cores:1 。

接下来看的是NM 与 RM 心跳,触发资源分配的逻辑,NM 与 RM 通信的协议是 ResourceTracker,只有这三个方法,最主要是nodeHeartbeat方法。
在这里插入图片描述
继续跟踪代码 看看RM怎么处理NM心跳
在这里插入图片描述
上面的代码会产生一个 nodeStatusEvent

在这里插入图片描述
看看具体的处理器 NodeEventDispatcher
在这里插入图片描述
它的处理逻辑跟RMApp的处理逻辑一样,找到具体的RMNodeImpl进行处理
在这里插入图片描述
RMNodeImpl 本身也维护了一个状态机,根据当前是Running 状态,调用具体的转换方法
在这里插入图片描述
最终会触发一个调度事件
在这里插入图片描述
事件类型为 SchedulerEventType.NODE_UPDATE。
在这里插入图片描述
它的处理器 SchedulerEventDispatcher
在这里插入图片描述
他这边也是一个生产者与消费者模型,放到一个队列
在这里插入图片描述
有一个线程进行消费,这个handle就是RM里面的调度器CapacityScheduler 。
在这里插入图片描述
看看CapacityScheduler 具体的处理逻辑
在这里插入图片描述
到这里 allocateContainersToNode ,基本就是进行资源的分配。
在这里插入图片描述
继续往下看 ,看看具体的资源分配逻辑 ,前面会做很多复杂的判断,省略,最终会调用到,ParentQueue,这里会判断是否有等待分配的资源
在这里插入图片描述
最终还是要分配到叶子队列,会一直递归找到叶子队列,具体调度器的分配流程,后面再详细分析。
在这里插入图片描述
同样通过NM心跳就能获取分配的结果。

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

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

相关文章

Mysql-01-主从搭建

一、安装Mysql 下载 https://downloads.mysql.com/archives/community/ 安装 注意顺序 tar -xvf mysql-8.0.38-1.el9.x86_64.rpm-bundle.tar rpm -ivh mysql-community-common-8.0.38-1.el9.x86_64.rpm rpm -ivh mysql-community-client-plugins-8.0.38-1.el9.x86_64.r…

Vue3重构案例(使用vue3的语法重构element的button组件)

这篇文章紧接的上一篇文章,上篇文章是对给element的button组件写了一个单元测试,这篇文章是使用vue3的语法进行重构,这里说一下单元测试和重构的联系,当你给组件写了单元测试之后,重构会减少你很多的debug时间&#xf…

jdk22+maven环境配置教程+idea的maven环境配置(Windows系统)

前言 jdk是Java开发必要的编程环境,idea是常用的Java开发工具,这里着重解释一下maven。 maven就是我们经常看见的pom.xml文件,maven有以下三点功能: 1.项目构建(可以帮助我们更快速的打包、构建项目) 2.依…

数据操作10-15题(30 天 Pandas 挑战)

数据操作 1. 相关知识点1.12 分组与连表1.13 排名 2. 题目2.10 第N高的薪水2.11 第二高的薪水2.12 部门工资最高的员工2.13 分数排名2.14 删除重复的电子邮箱2.15 每个产品在不同商店的价格 1. 相关知识点 1.12 分组与连表 分组max_salaryemployee.groupby(departmentId)[sal…

【leetcode】双指针算法题

文章目录 1.算法思想2.移动零3.复写零方法一方法二 4.快乐数5.盛水最多的容器方法一(暴力求解)方法二(左右指针) 6.有效三角形的个数方法一(暴力求解)方法二(左右指针) 7.两数之和8.…

k8s学习--基于k8s的ELK日志收集的详细过程

文章目录 FilebeatFilebeat主要特点Filebeat使用场景 ELK简介Elasticsearch简介Elasticsearch主要特点Elasticsearch使用场景 Logstash简介Logstash主要特点Logstash使用场景 Kibana简介Kibana主要特点Kibana使用场景 简单理解 环境一、ELK集群部署1.软件安装2.软件配置及启动(…

【python】PyQt5控件尺寸大小位置,内容边距等API调用方法实战解析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序 SSM 新生报到系统小程序 功能介绍 学生 登录 注册 忘记密码 首页 学校公告 录取信息 录取详情 师资力量 教师详情 收藏 评论 用户信息修改 宿舍安排 签到信息 在线缴费 教室分配 我的收藏管理 我要发贴 我的发贴 管理…

STM32外扩SRAM及用法

一.概述 一般单片机有片内的RAM,但都不多,比如:STM32F407ZGT6 自带了 192K 字节的 RAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合,比如做华丽效果的 GUI,处理大量数据…

ionic7 使用Capacitor打包 apk 之后,设置网络权限

报错处理 在打包的时候遇到过几个问题,这里记录下来两个 Visual Studio Code运行ionic build出错显示ionic : 无法加载文件 ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在 ionic7 项目初始化以及打包 apk 这篇文章讲到了如果安装…

Java+前后端分离架构+ MySQL8.0.36产科信息管理系统 产科电子病历系统源码

Java前后端分离架构 MySQL8.0.36产科信息管理系统 产科电子病历系统源码 产科信息管理系统—住院管理 数字化产科住院管理是现代医院管理中的重要组成部分,它利用数字化技术优化住院流程,提升医疗服务质量和效率。以下是对数字化产科住院管理的详细阐述…

您的私人办公室!-----ONLYOFFICE8.1版本的桌面编辑器测评

随时随地创建并编辑文档,还可就其进行协作 ONLYOFFICE 文档是一款强大的在线编辑器,为您使用的平台提供文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 网页地址链接: https://www.onlyoffice.com/zh/office-suite.aspxhttps://www…

2个方法教你轻松移除pdf文件编辑限制

PDF是一种常见的办公文档格式,常用于文件共享和保护。然而,有时候我们需要编辑PDF文件中的内容,但受到了编辑限制。本文将介绍一些有效的方法,帮助您解除PDF的编辑限制,轻松进行编辑和修改。 一、通过密码取消PDF“限制…

运维锅总详解计算机缓存溢出

本文尝试从缓存溢出、如何平衡防止缓存溢出和OOM、conntrack缓存满载影响及优化措施、TCP/IP协议栈缓存满载影响及优化措施等方面对计算机缓存溢出进行详细分析,最后给出一些缓存满载的Prometheus告警规则。希望对您有所帮助! 一、计算机缓存溢出简介 …

卫星轨道平面简单认识

目录 一、轨道平面 1.1 轨道根数 1.2 应用考虑 二、分类 2.1 根据运行高度 2.2 根据运行轨迹偏心率 2.3 根据倾角大小 三、卫星星座中的轨道平面 四、设计轨道平面的考虑因素 一、轨道平面 1.1 轨道根数 轨道平面是定义卫星或其他天体绕行另一天体运动的平面。这个平…

通过端口和进程pid查找启动文件/脚本

今天审计一个程序又让GPT给我上了一课,记一下笔记: 1、首先该程序开启了8080端口,使用如下命令得到pid为1817 netstat -tunlp|grep 80802、使用pid得到父进程 pstree -ps 1817输出结果如下: 3、看出程序是由systemd启动的&…

nginx安装演示(离线安装,直接安装在Linux中)

文章目录 1、创建文件夹 tool / nginx2、把安装文件放到 /opt/tool/nginx 目录下面3、yum install gcc4、yum install gcc-c5、tar -zxvf pcre-8.37.tar.gz6、./configure7、make8、make install9、tar -zxvf openssl-1.0.1t.tar.gz10、./config11、/config 1、创建文件夹 tool…

python绘制领域矩形

问题描述: 使用python书写代码实现以下功能:给定四个点的坐标,调用一个函数,可以使原来的四个点分别向四周上下左右移动15距离,分别记录下移动后的坐标,然后画出内侧矩形和外侧矩形 代码: im…

电脑为什么会提示丢失msvcp140.dll?怎么修复msvcp140.dll文件会靠谱点

电脑为什么会提示丢失msvcp140.dll?其实只要你的msvcp140.dll文件一损坏,然而你的电脑程序需要运用到这个msvcp140.dll文件的时候,就回提示你丢失了msvcp140.dll文件!因为没有这个文件,你的很多程序都用不了的。今天我…

Purple Pi OH 更改SDK的编译选项

本文适用于在Purple Pi OH开发板更改SDK编译选项。触觉智能的Purple Pi OH鸿蒙开源主板,是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党,极客,工程师,极大降低了开源鸿蒙开发者的入门门槛,具有以下…