Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Application狀態機詳解

Application狀態機詳解

編輯:關於Android編程

概述       前面已經分析了RM的狀態機,接下來將分析NM的狀態機,NM狀態機包括Container,Application,LocalizedResource三個。首先我們分析Application的狀態機。       NodeManager維護著本節點執行的Application,從圖1中可以看出其維護了user,containers,AppId和狀態信息。Application的實現類為ApplicationImpl。圖2展示了Application的狀態機。           圖1 Application接口       圖2 Application狀態機圖   Application狀態轉換與解釋   NEW,       在NM中,ContainerManagerImpl實現了ContainerManagementProtocol協議,因此RM和AM可以通過RPC調用startContainers方法命令NM啟動相應的Container。在NM的startContainers方法中,會創建ApplicationImpl對象,初始狀態為NEW。       INITING,       在NM的startContainers方法中,生成ApplicationImpl對象後,會創建ApplicationEventType.INIT_APPLICATION事件,ApplicationImpl調用AppInitTransition處理此事件,然後設置狀態為INITING。       RUNNING,       需要經過兩部初始化才能到RUNNING狀態。分別為初始化HDFS和本地目錄。       在AppInitTransition中,會創建LogHandlerEventType.APPLICATION_STARTED事件,LogHandler會處理此事件,實際上,做為LogHandler的實現類,LogAggregationService初始化App的主要工作是創建目錄(一般是HDFS上,通過remoteFS.getWorkingDirectory()方法或得相應目錄)和初始化AppAggregator(負責收集container的日志並存儲到HDFS上),結束初始化工作後創建ApplicationEventType.APPLICATION_LOG_HANDLING_INITED事件。ApplicationImpl調用AppLogInitDoneTransition處理此事件,期間創建LocalizationEventType.INIT_APPLICATION_RESOURCES事件,然後設置ApplicationImpl為INITING。       ResourceLocalizationService負責處理LocalizationEventType.INIT_APPLICATION_RESOURCES事件,即初始化本地目錄,然後創建ApplicationEventType.APPLICATION_INITED事件,ApplicationImpl調用AppInitDoneTransition處理此事件,這時候為App下的每個container創建ContainerEventType.INIT_CONTAINER事件,最後設置ApplicationImpl為RUNNING。       FINISHING_CONTAINERS_WAIT,       如果RM返回給NM心跳信息顯示該App屬於appsToCleanup列表,或者NM自己停止服務,這時候會創建ApplicationEventType.FINISH_APPLICATION事件,ApplicationImpl調用AppFinishTriggeredTransition處理此事件,如果該App沒有container,則ApplicationImpl狀態被置為ApplicationState.APPLICATION_RESOURCES_CLEANINGUP;負責為每個container創建ContainerEventType.KILL_CONTAINER事件,然後設置ApplicationImpl的狀態為ApplicationState.FINISHING_CONTAINERS_WAIT。       這裡解釋一下,為什麼結束的觸發是NM結束服務和RM通知NM,NM結束服務然後通知App很容易理解,但是正常情況下為什麼是RM通知NM結束相應的App,這時因為如果ApplicationMaster結束後,RM知道此信息,然後通知NM應該通知這個App對應的container。       APPLICATION_RESOURCES_CLEANINGUP,       當container結束的時候,會創建APPLICATION_CONTAINER_FINISHED事件,ApplicationImpl會調用AppFinishTransition處理此事件,如果此時App下沒有container,那麼設置ApplicationImpl狀態為APPLICATION_RESOURCES_CLEANINGUP,負責設置為FINISHING_CONTAINERS_WAIT。       FINISHED       在設置ApplicationImpl狀態為APPLICATION_RESOURCES_CLEANINGUP前,ApplicationImpl會創建LocalizationEventType.DESTROY_APPLICATION_RESOURCES和AuxServicesEventType.APPLICATION_STOP事件,ResourceLocalizationService負責負責DESTROY_APPLICATION_RESOURCES事件,它使用異步方式刪除本地App的臨時文件,如appcache,nmPrivate等相應的目錄。然後生成ApplicationEventType.APPLICATION_RESOURCES_CLEANEDUP事件,ApplicationImpl調用AppCompletelyDoneTransition處理此事件,期間生成LogHandlerEventType.APPLICATION_FINISHED事件,然後設置ApplicationImpl狀態為FINISHED。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved