NodeManager生命周期介绍

ResourceManager 内维护了 NodeManager 的生命周期;对于每个 NodeManager 在 ResourceManager 中都有一个 RMNode 与其对应;除了 RMNode ,ResourceManager 中还定义了 NodeManager 的状态(states)以及触发状态转移的事件(event)。具体如下:

  • org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode:这是一个接口,每个 NodeManager 都与 RMNode 对应,这个接口主要维护 NodeManager 的可用资源(主要是内存及CPU)以及其他一些静态信息(比如NodeManager 的ID、hostname、Http端口、健康状况、机架名称等);

  • org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl:这个类实现了 RMNode 接口,其记录了当前 NodeManager 中所有运行的 applications/containers;并且这里面还定义了 NodeManager 的状态转移以及其处理的类。

  • org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeEventType:这是个枚举类,定义了 NodeManager 所有的事件类型。

  • org.apache.hadoop.yarn.api.records.NodeState:这也是个枚举类,其定义了 NodeManager 所有可能的状态。

RMNodeImpl 中定义了 NodeManager 的状态转移情况,如下:

private static final StateMachineFactory<RMNodeImpl,
                                         NodeState,
                                         RMNodeEventType,
                                         RMNodeEvent> stateMachineFactory 
               = new StateMachineFactory<RMNodeImpl,
                                         NodeState,
                                         RMNodeEventType,
                                         RMNodeEvent>(NodeState.NEW)

   //Transitions from NEW state
   .addTransition(NodeState.NEW, NodeState.RUNNING, 
       RMNodeEventType.STARTED, new AddNodeTransition())

   //Transitions from RUNNING state
   .addTransition(NodeState.RUNNING, 
       EnumSet.of(NodeState.RUNNING, NodeState.UNHEALTHY),
       RMNodeEventType.STATUS_UPDATE, new StatusUpdateWhenHealthyTransition())
   .addTransition(NodeState.RUNNING, NodeState.DECOMMISSIONED,
       RMNodeEventType.DECOMMISSION,
       new DeactivateNodeTransition(NodeState.DECOMMISSIONED))
   .addTransition(NodeState.RUNNING, NodeState.LOST,
       RMNodeEventType.EXPIRE,
       new DeactivateNodeTransition(NodeState.LOST))
   .addTransition(NodeState.RUNNING, NodeState.REBOOTED,
       RMNodeEventType.REBOOTING,
       new DeactivateNodeTransition(NodeState.REBOOTED))
   .addTransition(NodeState.RUNNING, NodeState.RUNNING,
       RMNodeEventType.CLEANUP_APP, new CleanUpAppTransition())
   .addTransition(NodeState.RUNNING, NodeState.RUNNING,
       RMNodeEventType.CLEANUP_CONTAINER, new CleanUpContainerTransition())
   .addTransition(NodeState.RUNNING, NodeState.RUNNING,
       RMNodeEventType.RECONNECTED, new ReconnectNodeTransition())

   //Transitions from UNHEALTHY state
   .addTransition(NodeState.UNHEALTHY, 
       EnumSet.of(NodeState.UNHEALTHY, NodeState.RUNNING),
       RMNodeEventType.STATUS_UPDATE, new StatusUpdateWhenUnHealthyTransition())
   .addTransition(NodeState.UNHEALTHY, NodeState.DECOMMISSIONED,
       RMNodeEventType.DECOMMISSION,
       new DeactivateNodeTransition(NodeState.DECOMMISSIONED))
   .addTransition(NodeState.UNHEALTHY, NodeState.LOST,
       RMNodeEventType.EXPIRE,
       new DeactivateNodeTransition(NodeState.LOST))
   .addTransition(NodeState.UNHEALTHY, NodeState.REBOOTED,
       RMNodeEventType.REBOOTING,
       new DeactivateNodeTransition(NodeState.REBOOTED))
   .addTransition(NodeState.UNHEALTHY, NodeState.UNHEALTHY,
       RMNodeEventType.RECONNECTED, new ReconnectNodeTransition())
   .addTransition(NodeState.UNHEALTHY, NodeState.UNHEALTHY,
       RMNodeEventType.CLEANUP_APP, new CleanUpAppTransition())
   .addTransition(NodeState.UNHEALTHY, NodeState.UNHEALTHY,
       RMNodeEventType.CLEANUP_CONTAINER, new CleanUpContainerTransition())

   // create the topology tables
   .installTopology(); 

上面定义了 NodeManager 每种状态之间的转移及其触发的事件。比如从 NodeState.NEW 状态转移到 NodeState.RUNNIN 的触发事件为 RMNodeEventType.STARTED,其状态转移处理类为 AddNodeTransition 。根据上面的定义我们可以画出 NodeManager 整个生命周期转换图:
image

从上图可以看出,NodeManager 生命周期的开始状态和最终状态:

开始状态: NEW
最终状态: DECOMMISSION / REBOOTED / LOST
所有的 NodeManager 向 ResourceManager 注册的初始化状态都为 NodeState.NEW,一旦向 ResourceManager 注册成功其状态会更新为 NodeState.RUNNIN。还会处理以下两件事:

  • 如果这个 NodeManager 之前在 ResourceManager 中的 inactive 节点列表里面,说明这个节点之前处于 LOST 、REBOOTED、DECOMMISSIONED 或 UNHEALTHY 的状态,但是现在这个节点正常了,所以我们需要把该 NodeManager 从 inactive 节点列表移除,并且更新集群的 Metrics 信息(增加 Active Node 的个数,减少处于 LOST 、REBOOTED、DECOMMISSIONED 或 UNHEALTHY 状态节点的个数);
  • 否则直接更新集群的 Metrics 信息,并增加 Active Node 的个数。

NodeManager 在启动之后会默认每隔 1s (由 yarn.resourcemanager.nodemanagers.heartbeat-interval-ms 参数配置)向 ResourceManager 发送心跳信息。在 ResourceManager 端会启动 PingChecker 线程默认每隔 200s (yarn.nm.liveness-monitor.expiry-interval-ms 参数值得三分之一)检测所有注册到 ResourceManager 的节点,一旦发现有节点超过 600s (由 yarn.nm.liveness-monitor.expiry-interval-ms 参数配置)没有发送心跳信息,则认为这个节点出问题了,这时候将会把这个节点从 running 列表中移除,并发送 RMNodeEventType.EXPIRE 事件。RMNodeImpl 接收到这个事件会通过 DeactivateNodeTransition 类来处理,这个类会将此节点从 ResourceManager 可用节点列表中移除,并加入到 inactiveNodes 列表里面,此时 NodeManager 状态由 NodeState.RUNNINGNodeState.UNHEALTHY 状态转移到 NodeState.LOST 状态,而且该节点被标记为 NodesListManagerEventType.NODE_UNUSABLE。所有在这个节点上运行的 containers 将会标记为失败,并且会分配到新的 NodeManager 上运行。

NodeManager 其他状态之间的转移及其触发的事件这里就不再详细阐述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值