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