分享

关于任务调度时遇到的几个问题,求大家解惑

gwgyk 发表于 2014-11-3 15:35:26 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 11 9863
1、在JobQueueTaskScheduler的assignTasks()方法中,用来分配Map任务的obtainNewNodeOrRackLocalMapTask()方法和obtainNewNonLocalMapTask()方法分别分配了哪些Map任务?它们的区别在哪儿?因为他们最终都调用了findNewMapTask()方法。


2、在findNewMapTask()方法中,为什么要有这句话呢?“key = key.getParent();” (第2382行)
  1. if (node != null) {
  2.       Node key = node;
  3.       int level = 0;
  4.       // maxCacheLevel might be greater than this.maxLevel if findNewMapTask is
  5.       // called to schedule any task (local, rack-local, off-switch or
  6.       // speculative) tasks or it might be NON_LOCAL_CACHE_LEVEL (i.e. -1) if
  7.       // findNewMapTask is (i.e. -1) if findNewMapTask is to only schedule
  8.       // off-switch/speculative tasks
  9.       int maxLevelToSchedule = Math.min(maxCacheLevel, maxLevel);
  10.       for (level = 0;level < maxLevelToSchedule; ++level) {
  11.         List <TaskInProgress> cacheForLevel = nonRunningMapCache.get(key);
  12.         if (cacheForLevel != null) {
  13.           tip = findTaskFromList(cacheForLevel, tts,
  14.               numUniqueHosts,level == 0);
  15.           if (tip != null) {
  16.             // Add to running cache
  17.             scheduleMap(tip);
  18.             // remove the cache if its empty
  19.             if (cacheForLevel.size() == 0) {
  20.               nonRunningMapCache.remove(key);
  21.             }
  22.             return tip.getIdWithinJob();
  23.           }
  24.         }
  25.         key = key.getParent();
  26.       }
复制代码

    也就是说,它为什么还要向父节点递归呢?  谢谢大家了


findNewMapTask()方法在JobInProgress类中

已有(11)人评论

跳转到指定楼层
sstutu 发表于 2014-11-3 16:46:53

obtainNewNodeOrRackLocalMapTask会通过调用findNewMapTask获取map数组中的索引值。

(1)findNewMapTask()首先从失败task选取合适的task直接返回。findNewMapTask方法会先通过findTaskFromList方法从failedMaps获取合适的失败map并返回(返回条件是

A、该tasktracker没运行过TaskInProgress;

B、该TaskInProgress失败过的节点数不低于运行taskTracker的主机数,这两个满足一个即可),

如果有合适的失败map task,则通过scheduleMap(tip)方法将其加入nonLocalRunningMaps(该task没有对应的分片信息)或者runningMapCache(每个分片的存储Node及其对应的maptask列表,还有Node的父节点Node及对应的maptask列表也要加入),然后返回给obtainNewNodeOrRackLocalMapTask这个maptask在map数组中的索引值,此时从失败的task中寻找合适的task并不考虑数据的本地性。

 (2)如果没有合适的失败task,则获取当前tasktracker对应的Node,然后“从近到远一层一层地寻找,直到找到合适的TaskInProgress”(通过不断获取父Node)从nonRunningMapCache中获取此Node的所有map task列表,

如果列表不为空则调用findTaskFromList方法从这个列表中获取合适的TaskInProgress,

如果tip!=null 则调用scheduleMap(tip)(上面已经介绍),然后检查列表是否为空,为空则从nonRunningMapCache清除这个Node的所有信息,再返回给obtainNewNodeOrRackLocalMapTask这个maptask在map数组中的索引值,

如果遍历拓扑最大层数还是没有合适的task,则返回给obtainNewNodeOrRackLocalMapTask一个值-1,这里说明如果方法findNewMapTask的参数maxCacheLevel大于0则是获取(node-local或者rack-local,后面的其他情况不予考虑),其实就是优先考虑tasktracker对应Node有分片信息的本地的map(是node-local),然后再考虑父Node(同一个机架rack-local)的,再其他的(跨机架off-switch,这点得看设置的网络深度,大于2才会考虑),这样由近及远的做法会使得减少数据的拷贝距离,降低网络开销。 





回复

使用道具 举报

howtodown 发表于 2014-11-3 17:17:38
findNewMapTask的作用:
获取map数组中的索引值
逻辑:
1.首先找失败的map
2.找不到,就从近到远的原则,找到合适的TaskInProgress

key = key.getParent();
借用上面的话:

则获取当前tasktracker对应的Node,然后“从近到远一层一层地寻找,直到找到合适的TaskInProgress”(通过不断获取父Node)从nonRunningMapCache中获取此Node的所有map task列表
也就是说如果找不到,继续循环父节点

回复

使用道具 举报

gwgyk 发表于 2014-11-3 22:21:51
本帖最后由 gwgyk 于 2014-11-3 22:24 编辑
sstutu 发表于 2014-11-3 16:46
obtainNewNodeOrRackLocalMapTask会通过调用findNewMapTask获取map数组中的索引值。

(1)findNewMapTask ...
B、该TaskInProgress失败过的节点数不低于运行taskTracker的主机数
这句话意思是不是:该Task如果在所有结点上都失败的话,那就直接调度他,而不再考虑别的因素?

则通过scheduleMap(tip)方法将其加入nonLocalRunningMaps(该task没有对应的分片信息)
这句话中,没有对应的分片信息是指该Task可能是计算密集型Task,所以Input split为空吗?为什么父节点Node对应的mapt task列表也要加入呢?父节点上也会运行task吗?

从近到远一层一层地寻找,直到找到合适的TaskInProgress”(通过不断获取父Node)
为什么还要不断获取的父节点上的Task呢?一个host的父节点不就是rack吗?rack和根用InnerNode类来表示,和host的Node一样吗?在rack和InnerNode上也能运行Task吗?


关于最后一段话,我总结的是:obtainNewNodeOrRackLocalMapTask()是用来寻找node-local或者rack-local任务的,所以它的级别应该是anyCacheLevel(也就是3,即maxLevel+1,maxLevel默认为2),obtainNewNonLocalMapTask()是用来寻找off-switch或者speculative任务的,所以它的级别应该是NON_LOCAL_CACHE_LEVEL(也就是-1)。这样对不?

谢谢你的耐心讲解


回复

使用道具 举报

gwgyk 发表于 2014-11-3 22:27:54
howtodown 发表于 2014-11-3 17:17
findNewMapTask的作用:
获取map数组中的索引值
逻辑:

它为什么会循环去遍历父节点上的任务集合呢?父节点上会运行任务吗?父节点和普通的host结点一样吗?
回复

使用道具 举报

howtodown 发表于 2014-11-4 00:18:05
gwgyk 发表于 2014-11-3 22:27
它为什么会循环去遍历父节点上的任务集合呢?父节点上会运行任务吗?父节点和普通的host结点一样吗?

在job执行的时候,任务初始化时,createCache()方法会在网络拓扑结构上挂上需要执行的TaskInProgress。findNewMapTask()从近到远一层一层地寻找,首先是同一节点,然后在寻找同一机柜上的节点,接着寻找相同数据中心下的节点,直到找了maxLevel层结束。这样的话,在JobTracker给TaskTracker派发任务的时候,可以迅速找到最近的TaskTracker,让它执行任务。
回复

使用道具 举报

howtodown 发表于 2014-11-4 00:21:11
gwgyk 发表于 2014-11-3 22:27
它为什么会循环去遍历父节点上的任务集合呢?父节点上会运行任务吗?父节点和普通的host结点一样吗?


也就是说刚开始是一个拓扑结构,父节点和子节点只不过挂的位置不一样而已,本质都是TaskInProgress
回复

使用道具 举报

gwgyk 发表于 2014-11-4 09:20:06
本帖最后由 gwgyk 于 2014-11-4 09:31 编辑
howtodown 发表于 2014-11-4 00:21
也就是说刚开始是一个拓扑结构,父节点和子节点只不过挂的位置不一样而已,本质都是TaskInProgress

我可不可以这样理解:所谓的父节点,其实也普通的主机结点,也会运行TaskInProgress,只不过他被DNSToSwitchMapping接口映射成了rack结点(父节点)或者根节点吗?
回复

使用道具 举报

howtodown 发表于 2014-11-4 12:13:35
gwgyk 发表于 2014-11-4 09:20
我可不可以这样理解:所谓的父节点,其实也普通的主机结点,也会运行TaskInProgress,只不过他被DNSToSwi ...
DNSToSwitchMapping还没有研究,不过无论父节点还是子节点它们都是主机结点
回复

使用道具 举报

gwgyk 发表于 2014-11-4 17:20:22
howtodown 发表于 2014-11-4 12:13
DNSToSwitchMapping还没有研究,不过无论父节点还是子节点它们都是主机结点

这么说就是父节点(rack)也是主机结点映射成的,所以父节点上也会有task?
不过这么说的话,岂不是所有的结点都在同一个rack下了?
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条