大家看看hadoop这个方法是干什么用的?

查看数: 15845 | 评论数: 18 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2014-10-31 17:36

正文摘要:

hadoop的mapred包下org/apache/hadoop/mapred/TaskTrackerManager.java类中的这个方法的是用来干什么的啊?unique host又代表什么呢?

回复

hyj 发表于 2014-11-4 23:58:23
gwgyk 发表于 2014-11-1 21:52
size不是就是返回该map集合的大小吗?
.size()
他的具体实现有吗?
上面只是猜测,只有看到具体实现,才能明白他的作用
pig2 发表于 2014-11-1 23:23:23
gwgyk 发表于 2014-11-1 21:52
size不是就是返回该map集合的大小吗?
1,1,1,1
value是偏移量,也就是Integer,为7,包括逗号
说是集合的大小有点笼统

gwgyk 发表于 2014-11-1 21:52:53
sstutu 发表于 2014-11-1 10:37
把size的实现也贴出来一下

由于map有key及value,因此uniqueHostsMap只是map的一个对象,因此这 ...

size不是就是返回该map集合的大小吗?
sstutu 发表于 2014-11-1 10:37:14
gwgyk 发表于 2014-11-1 09:31
他的实现是JobTracker中的getNumberOfUniqueHosts, 这个方法主要用来干什么呢?
uniqueHostsMap的定义为 ...


  1. public int getNumberOfUniqueHosts() {
  2.     return uniqueHostsMap.size();
  3.   }
复制代码

把size的实现也贴出来一下

  1. Map<String,Integer>uniqueHostsMap = new ConcurrentHashMap<String, Integer>();
复制代码
由于map有key及value,因此uniqueHostsMap只是map的一个对象,因此这里的string是key也就是分割的一个字符串
比如
1,1,1,1
2,2,2,2
那么key就是
1,1,1,1
value是偏移量,也就是Integer,为4
如果不出意外uniqueHostsMap.size();很有可能返回的是Integer,也就是是4.
但是这个需要你贴出size的实现。



gwgyk 发表于 2014-11-1 09:33:58
howtodown 发表于 2014-10-31 21:46
这个方法很少人去关注,有的说是向jobtracker请求UniqueHosts的size

getNumberOfUniqueHosts方法,返回向 ...

在JobTracker中,getNumberOfUniqueHosts()代表是什么意思呢?
gwgyk 发表于 2014-11-1 09:31:37
本帖最后由 gwgyk 于 2014-11-1 09:32 编辑

他的实现是JobTracker中的getNumberOfUniqueHosts, 这个方法主要用来干什么呢?
  1. public int getNumberOfUniqueHosts() {
  2.     return uniqueHostsMap.size();
  3.   }
复制代码

uniqueHostsMap的定义为:
  1. Map<String,Integer>uniqueHostsMap = new ConcurrentHashMap<String, Integer>();
复制代码



bioger_hit 发表于 2014-10-31 23:06:26
可以参考这篇文章,多少会有些帮助
MapReduce作业的生命周期源码分析之任务分配

sstutu 发表于 2014-10-31 23:02:55
参考下面
  1. //map优先于reduce,当TaskTracker上运行的map task数目小于平均的工作量,则向其分配map task
  2.   if (numMaps < maxMapLoad) {
  3.     int totalNeededMaps = 0;
  4.     synchronized (jobQueue) {
  5.       for (JobInProgress job : jobQueue) {
  6.         if (job.getStatus().getRunState() != JobStatus.RUNNING) {
  7.           continue;
  8.         }
  9.         Task t = job.obtainNewMapTask(taskTracker, numTaskTrackers,
  10.             taskTrackerManager.getNumberOfUniqueHosts());
  11.         if (t != null) {
  12.           return Collections.singletonList(t);
  13.         }
  14.         ……
  15.       }
  16.     }
  17.   }
  18.   //分配完map task,再分配reduce task
  19.   if (numReduces < maxReduceLoad) {
  20.     int totalNeededReduces = 0;
  21.     synchronized (jobQueue) {
  22.       for (JobInProgress job : jobQueue) {
  23.         if (job.getStatus().getRunState() != JobStatus.RUNNING ||
  24.             job.numReduceTasks == 0) {
  25.           continue;
  26.         }
  27.         Task t = job.obtainNewReduceTask(taskTracker, numTaskTrackers,
  28.             taskTrackerManager.getNumberOfUniqueHosts());
  29.         if (t != null) {
  30.           return Collections.singletonList(t);
  31.         }
  32.         ……
  33.       }
  34.     }
  35.   }
  36.   return null;
  37. }
复制代码



从上面的代码中我们可以知道,JobInProgress的obtainNewMapTask是用来分配map task的,其主要调用findNewMapTask,根据TaskTracker所在的Node从nonRunningMapCache中查找TaskInProgress。JobInProgress的obtainNewReduceTask是用来分配reduce task的,其主要调用findNewReduceTask,从nonRunningReduces查找TaskInProgress。


知道obtainNewMapTask分配任务,getNumberOfUniqueHosts只是一个参数,对于这个参数是什么,你需要进一步提供它的实现代码,大家一起研讨。








sstutu 发表于 2014-10-31 22:44:20
你这是看得哪个版本的api
关闭

推荐上一条 /2 下一条