nodemanager黑名单

1、am什么时候将nodemanager加入黑名单?

如果一个nodemanager节点上的yarn任务失败次数达到3次(mapreduce.job.maxtaskfailures.per.tracker),任务的application master会请求resources manager将这个nodemanager列入这个作用的黑名单

这就意味着,不会将该作业的新的任务分配给列在黑名单的nodemanager

 

注意:

1)黑名单是针对每个作业的,其他作业不受影响

2)黑名单这个功能默认是被开启的(yarn.app.mapreduce.am.job.node-blacklisting.enable)

 

代码逻辑功能在containerFailedOnHost(String hostName) of RMContainerRequestor.java:

 maxTaskFailuresPerNode =
      conf.getInt(MRJobConfig.MAX_TASK_FAILURES_PER_TRACKER, 3);

  protected void containerFailedOnHost(String hostName) {
  
    LOG.info(failures + " failures on node " + hostName);
    if (failures >= maxTaskFailuresPerNode) {
      blacklistedNodes.add(hostName);
      if (!ignoreBlacklisting.get()) {
        blacklistAdditions.add(hostName);
      }
      //Even if blacklisting is ignored, continue to remove the host from
      // the request table. The RM may have additional nodes it can allocate on.
      LOG.info("Blacklisted host " + hostName);

 

 2、什么时候am将忽略黑名单?

当黑名单的nodemanager节点数百分比达到了集群的33%(yarn.app.mapreduce.am.job.node-blacklisting.enable),作业的application master将请求resourcesmanaer忽略黑名单,并且释放所有的黑名单节点

假设集群有100个nodemanager,当有33个节点被标记为黑名单是,黑名单将会忽略,并且释放所有的黑名单节点

 

这个代码逻辑功能在computeIgnoreBlcaklisting() of RMContainerRequestor.java:

int val = (int) ((float) blacklistedNodes.size() / clusterNmCount * 100);
      if (val >= blacklistDisablePercent) {
        if (ignoreBlacklisting.compareAndSet(false, true)) {
          LOG.info("Ignore blacklisting set to true. Known: " + clusterNmCount
              + ", Blacklisted: " + blacklistedNodeCount + ", " + val + "%");
          // notify RM to ignore all the blacklisted nodes
          blacklistAdditions.clear();
          blacklistRemovals.addAll(blacklistedNodes);
        }

 

3、在忽略黑名单后,am会重新加nodemanager加入到黑名单?

当前的行为是:如果该nodemanager曾经被列入黑名单过,那么在ignore-blacklist发生后,它将不会再次被列入黑名单,否则,它将给列入黑名单

 

这个代码逻辑功能在containerFailedOnHost(String hostName) of RMCotainerRequestor.java:

protected void containerFailedOnHost(String hostName) {
    if (!nodeBlacklistingEnabled) {
      return;
    }
    if (blacklistedNodes.contains(hostName)) {
      if (LOG.isDebugEnabled()) {
        LOG.debug("Host " + hostName + " is already blacklisted.");
      }
      return; //already blacklisted

 

上述行为的原因是在上述第二项:当忽略黑名单发生时,只要求RM清除“黑名单加项”,而不清除“黑名单节点”变量

如果之前的黑名单nodemanager是在忽略事件发生后释放的,那么这种行为可能会导致整个作业的失败

想象一下,一个连环杀人犯从监狱里释放出来,仅仅是因为监狱里面有33%的犯人,而且它在也不会被关进监狱了。只有新的谋杀案才会被关进监狱。

YARN-3571 is opened for this issue.

 

4、忽略黑名单事件会不会发生不止一次

不,被列入黑名单只会发生一次

这是因为RMContainerRequestor.java中的computeIgonreBlcaklisting()函数只触发忽略黑名单事件

if(ignoreblacklist.compareandset(false,ture))

 

这个函数compareAndSet的返回值为:如果为真,表示成功,如果是false表示实践不等于期望值

所以最初ignoreBlacklisting=false,一旦回来黑名单发生一次,函数compareAndSet将ignoreBlacklisting设置true之后,就再也不会触发忽略黑名单了

 

posted on 2020-04-26 16:00  gentleman_hai  阅读(1161)  评论(0编辑  收藏  举报

导航