2015-07-19 41 views
1

我有一个群集在其上运行YARN。它有3个datanode和1个客户端节点。我在客户端节点上提交我的所有作业。我怎样才能获得特定工作中所有任务的运行时间。Hadoop任务的已用时间

可能是RESTful API(https://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-site/MapredAppMasterRest.html)可用于此目的。但我很想知道是否有任何Java API可以做同样的事情。

我能够使用TaskReport类的getStartTime()方法找到所有任务的开始时间。虽然群集中的节点使用NTP同步时间,但我认为使用客户端系统当前时间(System.currentTimeMillis())来计算“正在运行”任务的已用时间可能会被接受即使在NTP中也与群集中的所有节点相关联。

+0

- StartTime',它在同一主机上进行测量。 –

+0

是的,赞同。但是为什么歪斜很重要,我想知道当前正在运行的任务的运行时间。对于当前正在运行的任务,getFinishTime()将返回“Wed Dec 31 19:00:00 EST 1969”作为默认值。 –

+0

这真的不可能我害怕。你能做的最好的确是使用客户端时钟。 –

回答

1

Job类中有一个称为#getTaskReports的方法。

你可以用这种方式来检索地图任务持续时间:为什么时钟偏差问题,如果你只计算`FinishTime

Job job = ...; 
job.waitForCompletion(); 

TaskReport[] reports = job.getTaskReports(TaskType.MAP); 
for(TaskReport report : reports) { 
    long time = report.getFinishTime() - report.getStartTime(); 
    System.out.println(report.getTaskId() + " took " + time + " millis!"); 
} 
+0

正如澄清问题的意见中所述,如果任务仍处于运行状态,则这可能不起作用。完成时间将为'Wed Dec 31 19:00:00 EST 1969'。 –