如何在Hadoop中找到每个mapper和reducer所花费的时间以及在代码(不是在web界面)中进行洗牌(排序)的时间?所有映射器(或reducer)的总时间是多少?
这里描述的JobTracker
有一个API,它为您提供了一堆关于集群本身的信息以及所有作业的详细信息。
特别是,如果您知道作业id,并且希望找到每个单独map和reduce任务的度量,则可以调用getMapTaskReports
,这将返回这里详细介绍的TaskReport
实例,该实例使您可以访问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中被计算为每个reduce任务的33%,这并不一定意味着它是33%的时间,但我不认为有一种自动的方法来获得每个任务的洗牌时间,所以你可以使用这个简单的启发式33%。
请考虑到,通过使用jobtracker API的时间测量,如上图所示,reducers中的时间可能有点偏差,因为当reduce任务启动时,它基本上会进行洗牌(如所解释的最多33%),然后它等待直到所有映射任务完成,然后才开始实际的减少,所以减少测量实际上是这3个周期的总和(shuffle + wait + reduce)。