4

如何在 Hadoop 中找到每个映射器和化简器所花费的时间以及在代码中(而不是在 Web 界面中)进行洗牌(排序)的时间?所有映射器(或减速器)的总时间如何?

4

1 回答 1

7

此处JobTracker描述的 API 为您提供了有关集群本身的大量信息以及所有作业的详细信息。

特别是,如果您知道作业 id 并且想要查找每个单独的 map 和 reduce 任务的指标,您可以调用getMapTaskReportswhich 将返回此处TaskReport详述的实例,该实例使您可以访问诸如or之类的方法。例如:getFinishTimegetStartTime

TaskReport[] maps = jobtracker.getMapTaskReports("your_job_id");
for (TaskReport rpt : maps) {
  long duration = rpt.getFinishTime() - rpt.getStartTime();
  System.out.println("Mapper duration: " + duration);
}
TaskReport[] reduces = jobtracker.getReduceTaskReports("your_job_id");
for (TaskReport rpt : reduces) {
  long duration = rpt.getFinishTime() - rpt.getStartTime();
  System.out.println("Reducer duration: " + duration);
}

要计算工作中所有映射器或化简器的总时间,您可以在代码中简单地总结它们。

关于洗牌,这通常在 jobtracker 中计为每个减少任务的 33%,这并不一定意味着它是 33% 的时间,但我不认为有一种自动化的方式来获得每个任务的洗牌时间,所以你可以使用 33% 的简单启发式方法。

请注意,虽然通过使用来自 jobtracker API 的时间测量,如上所示,reducers 中的时间可能有点偏差,因为当 reduce 任务启动时,它基本上会进行 shuffle(如解释的那样高达 33%),然后它等到所有 map 任务完成,然后才开始实际的 reduce,因此 reduce 测量实际上是这 3 个周期的总和(shuffle + wait + reduce)。

于 2013-05-25T06:52:35.637 回答