1、在JobQueueTaskScheduler的assignTasks()方法中,用来分配Map任务的obtainNewNodeOrRackLocalMapTask()方法和obtainNewNonLocalMapTask()方法分别分配了哪些Map任务?它们的区别在哪儿?因为他们最终都调用了findNewMapTask()方法。
2、在findNewMapTask()方法中,为什么要有这句话呢?“key = key.getParent();” (第2382行)
- if (node != null) {
- Node key = node;
- int level = 0;
- // maxCacheLevel might be greater than this.maxLevel if findNewMapTask is
- // called to schedule any task (local, rack-local, off-switch or
- // speculative) tasks or it might be NON_LOCAL_CACHE_LEVEL (i.e. -1) if
- // findNewMapTask is (i.e. -1) if findNewMapTask is to only schedule
- // off-switch/speculative tasks
- int maxLevelToSchedule = Math.min(maxCacheLevel, maxLevel);
- for (level = 0;level < maxLevelToSchedule; ++level) {
- List <TaskInProgress> cacheForLevel = nonRunningMapCache.get(key);
- if (cacheForLevel != null) {
- tip = findTaskFromList(cacheForLevel, tts,
- numUniqueHosts,level == 0);
- if (tip != null) {
- // Add to running cache
- scheduleMap(tip);
-
- // remove the cache if its empty
- if (cacheForLevel.size() == 0) {
- nonRunningMapCache.remove(key);
- }
-
- return tip.getIdWithinJob();
- }
- }
- key = key.getParent();
- }
复制代码
也就是说,它为什么还要向父节点递归呢? 谢谢大家了
findNewMapTask()方法在JobInProgress类中
|