應用程序在YARN中的整體運行流程和狀態機 (NodeManager端)

在上一篇應用程序在YARN中的整體運行流程和狀態機 (ResourceManager端)我們詳細分析了,應用程序在RM端的狀態機變遷,掠過了在NodeManager部分,這篇文章我們詳細分析,作業運行流程中在NodeManger上面的狀態機變遷包括:Container的資源本地化過程,Container啓動過程,Container運行結束後的清理過程。

  1. 發起NodeManager上面的容器運行首先,調用ContainerManagerImpl的startContainers方法,向ApplicationImpl對象發出ApplicationEventType.INIT_APPLICATION事件,從而ApplicationImpl進入INITING狀態,然後向ApplicationImpl對象發出ApplicationEventType.INIT_CONTAINER事件,而ApplicationImpl的狀態維持不變,只是把Container加入到對應的集合中。

  2. ApplicationEventType.INIT_APPLICATION事件的伴隨函數,向LogAggregationService發送APPLICATION_STARTED事件。

  3. 在日誌聚合處理成功的情況下向ApplicationImpl對象發出APPLICATION_LOG_HANDLING_INITED事件。ApplicationImpl的狀態機保持不變,還是INITING。

  4. APPLICATION_LOG_HANDLING_INITED事件的伴隨函數中,向 ResourceLocalizationService對象發送LocalizationEventType.INIT_APPLICATION_RESOURCES事件。

  5. 然後ResourceLocalizationService收到此事件,分別創造私有的和app級別的LocalResourcesTrackerImpl對象,加入到對應的數據結構中去。然後向ApplicationImpl發送APPLICATION_INITED事件。然後ApplicationImpl變爲RUNNING狀態。

  6. APPLICATION_INITED事件的伴隨函數中,向ContainerImpl發送INIT_CONTAINER事件,然後向AuxServices發送CONTAINER_INIT事件,和APPLICATION_INIT事件,然後向ResourceLocalizationService發送INIT_CONTAINER_RESOURCES事件。

  7. 收到INIT_CONTAINER_RESOURCES事件的ResourceLocalizationService向對應的LocalResourcesTrackerImpl,(三種情況,public資源,user級別private資源,application級別資源)對象發送ResourceEventType.REQUEST事件。

  8. LocalResourcesTrackerImpl收到ResourceEventType.REQUEST事件,然後向LocalizedResource對象發出ResourceEventType.REQUEST事件,LocalizedResource從INITING到DOWLOADING狀態。

  9. LocalizedResource從INITING到DOWLOADING狀態的伴隨函數中發送LocalizerEventType.REQUEST_RESOURCE_LOCALIZATION事件給ResourceLocalizationService,然後根據本地化的資源級別,將對應的資源請求加入到對應的下載線程中。具體是:將公共資源的本地化交給PublicLocalizer線程中的FSDownload完成具體文件的下載(公共資源都在RM上面),將非公共資源交給LocalizerRunner線程。

  10. 下載完成的線程會向LocalizedResource對象發送ResourceEventType.LOCALIZED,然後LocalizedResource對象的狀態機變爲LOCALIZED。

  11. LocalizedResource從DOWNLOADING狀態變爲LOCALIZED狀態的伴隨函數中,向ContainerImpl對象發送ContainerEventType.RESOURCE_LOCALIZED事件,然後ContainerImpl的狀態機變爲LOCALIZED。

  12. ContainerImpl的狀態機變爲LOCALIZED的伴隨函數中,向ResourceLocalizationService發送CONTAINER_RESOURCES_LOCALIZED事件,然後ResourceLocalizationService結束資源本地化過程,關閉本地化相關的服務。

  13. ContainerImpl的狀態機轉爲LOCALIZED的伴隨函數中,向ContainersLauncher發送LAUNCH_CONTAINER事件,然後構造啓動運行的線程ContainerLaunch對象,加入線程池執行。

  14. ContainerLaunch運行過程中,向ContainerImpl發送CONTAINER_LAUNCHED事件,然後ContainerImpl的狀態機轉入RUNNING狀態。

  15. ContainerImpl轉入RUNNING狀態的伴隨函數中,向ContainersMonitorImpl發送START_MONITORING_CONTAINER事件,ContainersMonitorImpl將該Container加入到監控Container的hash表中,ContainersMonitorImpl開始監控該容器的資源情況。

  16. 在ContainerLaunch線程是一個阻塞線程,發送完LAUNCH_CONTAINER事件後,利用ContainerExecutor的對象exec,執行啓動對應的命令行。(有三種類型的ContainerExecutor:DefaultContainerExecutor, DockerContainerExecutor, LinuxContainerExecutor)執行腳本成功並結束後,向ContainerImpl發送CONTAINER_EXITED_WITH_SUCCESS事件,然後ContainerImpl的狀態機轉爲EXITED_WITH_SUCCESS狀態。

  17. ContainerImpl的狀態機轉爲EXITED_WITH_SUCCESS狀態的伴隨函數中,向ContainersLauncher發送CLEANUP_CONTAINER事件,容器運行結束後的一些相關的清除工作。並且,向ResourceLocalizationService發送CLEANUP_CONTAINER_RESOURCES事件。

  18. ResourceLocalizationService收到CLEANUP_CONTAINER_RESOURCES事件後,先向ResourceLocalized對象發送ResourceEventType.RELEASE事件,然後刪除需要本地化隊列中的該容器代表,然後ResourceLocalizationService本身和該Container相關的一些清理工作,然後向ContainerImpl發送CONTAINER_RESOURCES_CLEANEDUP事件,然後ContainerImpl轉入DONE狀態。

  19. ContainerImpl轉入DONE狀態的伴隨函數中,依次分別向ApplicationImpl發送APPLICATION_CONTAINER_FINISHED事件,ApplicationImpl依然是RUNNING狀態,伴隨操作是將該Container從hash表中刪除。向ContainersMonitorImpl發送STOP_MONITORING_CONTAINER事件,ContainersMonitorImpl將該容器加入到待刪除List中。向LogAggregationService發送CONTAINER_FINISHED事件,記錄該容器相關的日誌。

狀態機圖如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章