概述

三大状态机:Application、Container、LocalizedResource。
当NM收到某应用第一个容器启动请求,会创建Application状态机。每个资源的下载过程由一个LocalizedResource维护。
image.png

Application

NM上的Application状态机是RM上的子集。方便对一个App的容器进行管理,可以通杀一个App的容器和获取当前App容器列表。NM上的Appliation生命周期和RM完全一致。
//TODO 这个状态机还需要探索

转换图

image.png

状态简介

INITING:应用初始化。收到第一个容器启动请求,触发INIT_APPLICATION事件,进入此状态。创建日志和工作目录,初始化AppLogAggregator、LogHandler、LocalResourcesTrackerImpl等。供后续容器用,第一个之后的容器创建就不走此状态了。
RUNNING:完成初始化后,触发APPLICATION_INITED事件。
FINISHING_CONTAINERS_WAIT:等待回收容器。NM收到RM发送的清理应用列表,会触发FINISH_APPLICAITON事件,会向容器发送KILL来回收。每个容器运行结束(可能是失败结束)会触发APPLICATION_CONTAINER_FINISHED事件。
APPLICATION_RESOURCES_CLEANINGUP:所有容器回收后,处于此状态。
FINISHED:ResourceLocalizationService将依赖资源全部发送给DeletionService(异步文件删除服务)来回收,触发APPLICATION_RESOURCES_CLEANEDUP,后进入此状态,表示完成。

Container

状态图

image.png

状态简介

LOCALIZING:从HDFS下载依赖文件资源,正在下载时处于此状态。INIT_CONTAINER事件触发进入此状态。
LOCALIZED:下载并缓存到本地后触发RESOURCE_LOCALIZED事件进入该状态。
LOCALIZATION_FAILED:文件或磁盘损坏导致下载失败,触发RESOURCE_FAILED事件进入此状态。

RUNNING:ContainerLaunch创建工作目录和构造执行脚本,并通过ContainerExecutor.launchContainer执行后触发CONTAINER_LAUNCHED事件进入此状态。launchContainer是阻塞调用,容器退出它才会返回,所以此事件是调用时触发,而不是返回时触发。
KILLING:NM(内存超阈值)、RM、AM(ContainerManagermentProtocol.stopContainer)都可以杀容器,触发KILL_CONTAINER事件,进入此状态,正在被杀时处于状态。

EXITEDWITH_SUCCESS:ContainerExecutor执行的脚本阻塞,阻塞结束正常退出(返回0)容器执行就是执行一个Shell脚本。触发_CONTAINER_EXITED_WITH_SUCCESS进入此状态。
EXITEDWITH_FAILURE:容器内应用运行异常。触发_CONTAINER_EXITED_WITH_FAILURE事件进入此状态。
CONTAINER_CLEANEDUP_AFTER_KILL:容器被强杀后,异常退出(Shell命令返回错误编号137或143)触发CONTAINER_KILLED_ON_REQUEST事件进入此状态。

DONE:NM清理占用的临时目录资源文件(主要是分布式缓存)后,触发CONTAINER_RESOURCES_CLEANUP进入此状态。

LocalizedResource

转换图

image.png

状态简介

INIT:初始状态
DOWNLOADING:需要下载资源时触发REQUEST事件。调用FileSystem.copyToLocalFile下载存储为临时文件XXX.tmp的过程
LOCALIZED:下载完成,ResourceLocalizationService触发LOCALIZED事件进入此状态。
FAILED:下载过程报错。触发LOCALIZATION_FAILED事件进入此状态。