Yarn中的幾種狀態機器

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   io   

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收到事件通知後更新自身的資訊。

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

如果您看了本篇部落格,覺得對您有所收穫,請點擊右下角的 [推薦]

如果您想轉載本部落格,請註明出處

如果您對本文有意見或者建議,歡迎留言

感謝您的閱讀,請關注我的後續部落格

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.