Yarn中的几种状态机

1 概述

    为了增大并发性,Yarn采用事件驱动的并发模型,将各种处理逻辑抽象成事件和调度器,将事件的处理过程用状态机表示。什么是状态机?

    如果一个对象,其构成为若干个状态,以及触发这些状态发生相互转移的事件,那么此对象称之为状态机。

    处理请求作为某种事件发送到系统中,由一个中央调度器传递给对应的事件调度器,进而对事件进行处理,处理完成之后再次发送给中央调度器,再进行处理,直至处理完成。

    Yarn的资源管理模块ResourceManager,其核心构成就是四类这样的状态机(基于2.4版本),分别是:

(1)RMApp:用于维护一个Application的生命周期;

(2)RMAppAttempt:用于维护一次试探运行的生命周期;

(3)RMContainer:用于维护一个已分配的资源最小单位Container的生命周期;

(4)RMNode:用于维护一个NodeManager的生命周期;

    以上四个状态机,以继承了EventHandler 的Interface的形式存在于Yarn源码的org.apache.hadoop.yarn.server.resourcemanager中。其具体实现类,则是对应的xxxImpl类。

    提交到Yarn中的应用程序被称为Application,它可能会尝试运行多次,每次的尝试运行称为“Application Attempt”,如果一次尝试运行失败,则由RMApp创建另一个继续运行,直至达到失败次数的上限。Container是运行环境的抽象概念,无论是ApplicationMaster还是具体的每个Task都得运行在Container中。

2 RMApp状态机

    此状态机的具体实现类为org.apache.hadoop.yarn.server.resourcemanager.rmapp. RMAppImpl。其内部记录了一个Application的所有状态RMAppState(共11种)、触发状态间转换的事件RMAppEvent(共14种)、Application的其他基本信息等。其功能就是接收其他对象发出的RMAppEventType类型的事件,然后根据当前状态和事件类型,将当前状态转移到另外一种状态,同时触发一种行为。

    下图是RMApp的状态转换图。

   

    其中,NEW_SAVING状态,指的是使用日志记录Application基本信息时所处的状态,这是RM收到Application时所做的第一件事情,以便故障后重启。接收到RECOVER重启事件后,可以从NEW状态直接转变为SUBMITTED、ACCEPTED、FINISHED、FAILED、KILLED、FINAL_SAVING状态,但是默认情况下,Recover是不开启的,可以通过参数yarn.rsourcemanager.recovery.enabled设置。

    APP_REJECTED事件触发的情况比较多,客户端在提交Application时如果发生异常、RM审核Application不合法等,均会触发。

    Application运行失败的情况也比较多,但是ATTEMPT_FAILED事件被触发后,不一定直接转入FAILED,系统会检查当前Application的失败次数是否达到上限,如果没有的话,会重新创建一个RMAppAttemptImpl对象,并让状态机回到ACCEPTED状态,否则进入FINAL_SAVING,进而进行失败处理,比如释放资源等。

3 RMAppAttempt状态机

此状态机的具体实现类为org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl。其内部记录了一个Application Attepmt的所有状态RMAppAttemptState (共13种)、触发状态间转换的事件RMAppAttemptEvent(共15种)等。其功能就是接收其他对象发出的RMAppAttemptEventType类型的事件,然后根据当前状态和事件类型,将当前状态转移到另外一种状态,同时触发一种行为。

    下图是RMAppAttempt的状态转换图。

 

 

 其中,RMAppAttemptImpl被创建之后,ResourceManager将其加入到ResourceScheduler中,通过合法性检查后的状态就是SCHEDULERED,此时开始给ApplicationMaster分配资源。在接收到分配的一个Container资源后,将Container信息写到磁盘,以后故障恢复用,保存完成之前的状态变为ALLOCATED_SAVING,保存完毕了状态就变为ALLOCATED

接着,ResourceManager中的ApplicationMasterLauncher与对应的NodeManager通信,进行启动ApplicationMaster,此时状态变为LAUNCHED,启动完成之后,ApplicationMaster立即向ResourceManager注册,状态变为RUNNING。

同时,由于Yarn允许ApplicationMaster启动在客户端,比如Spark的yarn-client模式,此时仍然需要记录ApplicationMaster的日志以便进行故障恢复,正在进行记录日志的RMAppAttemptImpl所处的状态就是LAUNCHED_UNMANAGED_SAVING,至于RECOVER,与前面的RMApp状态机类似。

还有几个比较重要的事件:

(1)CONTAINER_ALLOCATED:RresourceManager将某个NodeManager节点上的Container分配给RMAppAttemptImpl之后,会创建一个RMContainerImpl(后文会讲),并向该对象发送一个启动事件,进而向RMAppAttemptImpl发送一个CONTAINER_ALLOCATED事件,此时RMAppAttemptImpl将获取分配到的Container资源,并发起一个日志记录的事件,将资源分配的信息写到磁盘以便进行故障恢复。

(2)UNREGISTERED:当ApplicationMaster运行完成之后,会通知ResourceManager,ResourceManager接受到通知后会发送一个UNREGISTERED事件给RMAppAttemptImpl,进而进入FINISHING状态,等待Container退出后,资源被回收,再变为FINISHED状态。但是如果ApplicationMaster是由客户端自行启动的,收到UNREGISTERED事件后会直接变为FINISHED状态。

(3)CONTAINER_FINISHED:当ApplicationMaster所在的Container退出后,大当前NodeManager节点会将其状态汇报给ResourceManager,这时ResourceManager会发出一个FINISHED事件给RMContainerImpl,它再发出一个CONTAINER_FINISHED事件给RMAppAttemptImpl。

(4)EXPIRE:若ApplicationMaster一段时间内未汇报心跳,则ResourceManager会发出一个EXPIRE事件给RMAppAttemptImpl,会清理ApplicationMaster和Container。

(5)CONTAINER_ACQUIRED:ApplicationMaster获得资源后,向Container发出通知,RMContainerImpl接受到通知后进而向RMAppAttemptImpl发出CONTAINER_ACQUIRED事件,RMAppAttemptImpl将NodeManager信息保存,便于后面进行Container的清理。

(6)STATUS_UPDATE:ApplicationMaster向ResourceManager的心跳汇报。

4 RMContainer状态机

此状态机的具体实现类为org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerImpl。其内部记录了一个Container的所有状态RMContainerState (共9种)、触发状态间转换的事件RMContainerEvent (共8种)等。其功能就是接收其他对象发出的RMContainerEventType类型的事件,然后根据当前状态和事件类型,将当前状态转移到另外一种状态,同时触发一种行为。

    下图是RMContainerImpl的状态转换图。

 

    当一个NodeManager上的资源不足以满足当前一个Application的请求却有不得不分配给这个Application时,当前节点会为此Application预留资源,逐渐累加空余的剩余资源直至满足要求后才把资源封装成一个Container发给ApplicationMaster。如果一个Container已经被创建,并且处在剩余资源的累加过程中,它就处于上图中的RESERVED状态。当此Container已经分配给ApplicationMaster,并且此时ApplicationMaster还没发送通知说它已经得到了资源时,此Container处于ALLOCATED状态,直至ApplicationMaster发送通知给ResourceManager说它已经拿到了资源,则状态变为ACQUIRED

之后,ApplicationMaster与NodeManager通信来启动这些Container,并且NodeManager会将Container的状态通过心跳报告给ResourceManager,ResourceManager则对收到的心跳的每个Container发送一个LAUNCHED事件,RMContainerImpl将收到事件对应的Container从失效列表中移除,表示Container状态正常。如果一段时间内,ApplicationMaster都没有使用某个Container,则ResourceManager对此Container发出EXPIRE事件,进行资源回收。

5 RMNode状态机

    此状态机用于维护一个NodeManager的生命周期,其实现类是org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl,记录了NodeManager节点的各个状态NodeState (共6种)以及触发状态转换的事件RMNodeEvent(共9种),状态转换的同时会触发一种行为。

    下图是RMNodeImpl的状态转换图。

 

其中,如果一个NodeManager节点被加入到黑名单,则其状态会被置为DECOMMISHONED状态,即下线状态,进而NodeManager进程会退出。若当前NodeManager节点处于UNHEALTHY状态,不健康了(比如磁盘损坏),则会通过心跳通知给ResourceManager,ResourceManager将不再为此节点分配新的任务,向ResourceManager的心跳报告丢失之后,NodeManager变为LOST状态。

当Application执行完成之后,会触发CLEANUP_APP事件,用于清理程序所占用的内存,而一个Container执行完成的时候,会触发CLEANUP_CONTAINER事件,用于清理Container占用的资源。若一个NodeManager重复向ResourceManager注册,则ResourceManager会触发一个RECONNECTED事件,RMNodeImpl收到事件通知后更新自身的信息。

-------------------------------------------------------------------------------

如果您看了本篇博客,觉得对您有所收获,请点击右下角的 [推荐]

如果您想转载本博客,请注明出处

如果您对本文有意见或者建议,欢迎留言

感谢您的阅读,请关注我的后续博客

转载于:https://www.cnblogs.com/Scott007/p/3893318.html

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

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

相关文章

反转字符串里的单词

4、反转字符串里的单词 给定一个字符串,逐个反转字符串中的单词 示例1: 输入: "the sky is blue", 输出: "blue is sky the".说明: 无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格&#xff0…

正整数

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid84077#problem/A 题目: Description A magic island Geraldion, where Gerald lives, has its own currency system. It uses banknotes of several values. But the problem is, the s…

360 webscan中防注入跨站攻击的核心

//get拦截规则 $getfilter "\\<.javascript:window\\[.{1}\\\\x|<.*(&#\\d?;?)?>|<.*(data|src)data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\\(\d?|sleep\s*?\\([\d\.]?\\)|load_file\s*?\\()|<[…

POJ 2115 C Looooops(扩展欧几里得)

辗转相除法&#xff08;欧几里得算法&#xff09; 时间复杂度&#xff1a;在O(logmax(a, b))以内 int gcd(int a, int b) {if (b 0) return a;return gcd(b, a % b); }扩展欧几里得算法 时间复杂度和欧几里得算法相同 int extgcd(int a, int b, int& x, int& y) {int …

分支管理(转载)

转自&#xff1a;http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743862006503a1c5bf5a783434581661a3cc2084efa000 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习Git的时候&#xff0c;另一个你正在另一个平行…

匹配括号

输入&#xff1a; 仅包含{,},(,),[,]的字符串输出&#xff1a; 如果括号匹配输出&#xff1a;YES 否则输出&#xff1a;NOSolution&#xff1a; #include<iostream> #include<string> #include<stack> using namespace std;bool check(const string&)…

总线接口与计算机通信

微机中总线一般有内部总线、系统总线和外部总线。 内部总线是微机内部各外围芯片与处理器之间的总线&#xff0c;用于芯片一级的互连&#xff1b; 系统总线是微机中各插件板与系统板之间的总线&#xff0c;用于插件板一级的互连&#xff1b; 外部总线则是微机和外部设备之间的总…

uva 12442 . Forwarding Emails

“... so forward this to ten other people, to prove that you believe the emperor has new clothes.”Aren’t those sorts of emails annoying?Martians get those sorts of emails too, but they have an innovative way of dealing with them.Instead of just forwardi…

大数相加

输入&#xff1a; 两个用字符串表示的大整数 如a1111111111111,b222222222222222 输出&#xff1a; 两个数的和 Solution&#xff1a; #include<iostream> #include<algorithm> #include<string>using namespace std;int add(const char&,const char&…

Linux的进程与服务(一)

启动的配置文件/etc/inittab&#xff0c;修改完配置文件以后 init q立即生效 # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not h…

Linux 修改swap虚拟内存大小

swap是内存的交换区&#xff1b;换句话说&#xff0c;如果内存不够用了&#xff0c;那么系统会在硬盘上存储一些内存中不常用的数据&#xff0c;之后将这部分数据在存储中析构掉&#xff1b;这样内存就又有剩余空间可以运行东东啦&#xff0c;这个过程也就是所谓的交换&#xf…

统计文章中的单词

输入&#xff1a; 字符串&#xff0c;其中可能包含空格&#xff0c;TAB&#xff0c;回车等&#xff0c;规定&#xff0c;仅字母数字和单引号算作单词部分 输出&#xff1a; 单词的个数 Solution&#xff1a; #include<iostream> #include<string>using namespac…

迈向世界 拓展未来

一切都会过去&#xff0c;只有真理永存&#xff0c;只有愿意越过事实前进一步的人&#xff0c;才能理解事实&#xff0c;这就是科学。时代在发展&#xff0c;科技更是日新月异彻底改变着我们的生活方式。现在的我们就是跟着科技发展的脚步&#xff0c;奔着梦想&#xff0c;一直…

JS - 跳转页面

<!-- 第一种&#xff1a; --><script type"text/javascript">window.location.href "login.jsp?backurl" window.location.href;</script><!-- 第二种&#xff1a; --><script type"text/javascript"&g…

分享一个用安卓手机就能引导pc安装linux系统办法

1、首先安卓手机下载软件DriveDroid.apk http://pan.baidu.com/s/1qW4pbT6 2、下载linux镜像文件放手机存储卡存储&#xff0c;放到Download/images/以下 3、打开软件会自己主动读取这个目录以下镜像&#xff0c;也能够在软件里面下载须要的镜像文件 4、软件设置usb连接模式 5、…

SharePoint 2013 开发——其他社交功能

博客地址&#xff1a;http://blog.csdn.net/FoxDave上一篇讲了如何获取用户配置文件的相关属性&#xff0c;它属于SharePoint 2013社交功能的一个小的构成部分。社交功能是SharePoint 2013改进的一大亮点。可以在现有网站上开启社交功能或者新建一个专门用于社交用途的社区网站…

第一个Qt+opencv程序

简单安装好Qt和编译安装好opencv后&#xff0c;简单实现第一个Qtopencv程序&#xff1a;读取并显示一张图片&#xff0c;这里我的Qt版本时5.9.1&#xff0c;opencv版本是4.0.1&#xff0c;版本的影响不大。 首先我们用Qt创建一个控制台项目&#xff0c;即在创建项目时选择Qt C…

redis学习笔记——应用场景

最近在看redis入门指南&#xff0c;现在就自己的学习情况说说自己的理解。 字符串类型&#xff08;String&#xff09; 字符串类型是Redis中最基本的类型&#xff0c;能存储任意形式的字符串&#xff0c;包括二进制数据。如一张照片也可以用字符串类型存储。注意字符串类型键允…

Unity的Cover flow的实现包(2个)

苹果的mac机上预览图片&#xff0c;有一个所谓的cover flow的效果&#xff0c;这里收集到两个&#xff0c;两个实现效果略有不同。 1、老外的实现 https://github.com/rakkarage/Unity3D-CoverFlow 这个焦点图片在到最后位置前会模拟一个抖动效果 2、国人的实现 http://game.ce…

卸载全部appx应用(包括应用商店)

在PowerShell中粘贴&#xff1a; Get-AppXPackage | Remove-AppxPackage 转载于:https://www.cnblogs.com/Bob-wei/p/4691854.html