【问题标题】:Elapsed Time for a Hadoop TaskHadoop 任务的已用时间
【发布时间】:2015-07-19 09:24:55
【问题描述】:

我有一个运行 YARN 的集群。它有 3 个数据节点和 1 个客户端节点。我在客户端节点上提交所有作业。如何获取特定作业中所有任务的经过时间。

可能 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 中,延迟也与集群中的所有节点相关。

【问题讨论】:

  • 如果您只计算 FinishTime - StartTime,为什么时钟偏差很重要,它是在同一主机上测量的。
  • 是的,同意这一点。但是倾斜很重要的原因是,我也想知道当前正在运行的任务的经过时间。对于当前正在运行的任务,getFinishTime() 将返回 'Wed Dec 31 19:00:00 EST 1969' 作为默认值。
  • 恐怕这不太可能。您能做的最好的事情就是使用客户端时钟。

标签: java hadoop task hadoop-yarn elapsed


【解决方案1】:

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

您可以使用它来检索地图任务持续时间:

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!");
}

【讨论】:

  • 正如 cmets 中提到的问题澄清,如果任务仍处于运行状态,这可能不起作用。结束时间为“Wed Dec 31 19:00:00 EST 1969”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多