如何在 Hadoop 中找到每个映射器和化简器所花费的时间以及在代码中(而不是在 Web 界面中)进行洗牌(排序)的时间?所有映射器(或减速器)的总时间如何?
问问题
3336 次
1 回答
7
此处JobTracker
描述的 API 为您提供了有关集群本身的大量信息以及所有作业的详细信息。
特别是,如果您知道作业 id 并且想要查找每个单独的 map 和 reduce 任务的指标,您可以调用getMapTaskReports
which 将返回此处TaskReport
详述的实例,该实例使您可以访问诸如or之类的方法。例如:getFinishTime
getStartTime
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 回答