2015-07-19 45 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'。 –