diff --git a/README.md b/README.md index 6035dd1..2793581 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ mvn -T 8 package -Pdist,native -DskipTests -Dmaven.javadoc.skip=true - [ResourceManager详解](./yarn/resourcemanager.md) - [作业启动](./yarn/job_start.md) - Yarn NodeManager相关 - - [NodeManager 详解](./yarn/containerManager.md) + - [containerManager 详解](./yarn/containerManager.md) - Yarn 事件相关 - [Yarn状态机](./yarn/yarn_event.md) diff --git a/yarn/containerManager.md b/yarn/containerManager.md index 55dff43..24ac9a4 100644 --- a/yarn/containerManager.md +++ b/yarn/containerManager.md @@ -137,7 +137,33 @@ dispatcher.getEventHandler().handle( new ApplicationContainerInitEvent(container)); ``` -## Container事件处理 +# 停止Container + +## 获取NMToken + +在Container停止之前需要获取NMToken,可以通过下面命令获取,一般情况下获取第一个NMTokenIdentifier类型的Token。和启动时候的类似。 + +```java +Set tokenIdentifiers = remoteUgi.getTokenIdentifiers(); +``` + +## 停止作业 + +停止作业的时候会优先通过`context.getContainers().get(containerID)`获取Container信息。 + +如下场景会抛出异常: +- 对于查询不到的Container,如果不是最新停止的,则会抛出异常。 +- 对于正在恢复的Container,不会接受停止,会抛出异常。 + + +停止作业的核心逻辑如下,核心思想是触发KILL事件。具体可以参见[Container事件处理](#Container事件处理) +```java +context.getNMStateStore().storeContainerKilled(containerID); +container.sendKillEvent(ContainerExitStatus.KILLED_BY_APPMASTER, + "Container killed by the ApplicationMaster."); +``` + +# Container事件处理 Container启动的开始是从事件InitContainerTransition。由当前事件通过状态机转到其他状态。