概述
前面已經分析了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。