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.pswp.cn/news/375708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375708.shtml
英文地址,請注明出處:http://en.pswp.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