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之后,就再也不會觸發忽略黑名單了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM