hadoop:我怎么知道任务在失败时处理的文件?

时间:2013-12-21 11:16:42

标签: hadoop

我的工作有一些失败的任务。我想尝试重现任务处理的文件,但无法找到如何知道这些文件。

如何在失败时找到任务处理的文件?

2 个答案:

答案 0 :(得分:1)

我不知道这是否真的有效,但您可能想尝试一下(我使用Hadoop 2.2进行编码):

job.waitForCompletion(true);
Class<? extends InputFormat<?, ?>> clz = job.getInputFormatClass();
InputFormat<?, ?> inputFormat = ReflectionUtils.newInstance(clz, conf);
List<InputSplit> splits = inputFormat.getSplits(job);
TaskCompletionEvent[] events = job.getTaskCompletionEvents(0);
for (TaskCompletionEvent ev : events) {
  if (ev.isMapTask() && ev.getStatus() == Status.FAILED) {
    int idWithinJob = ev.idWithinJob();
    InputSplit inputSplit = splits.get(idWithinJob);
    if (inputSplit instanceof FileSplit) {
      FileSplit sp = (FileSplit) inputSplit;
      System.out.println(sp.getPath() + " failed!");
    }
  }
} 

这个想法很简单,你可以获得所有任务事件,获取地图和失败事件。然后,您可以获取通常在内部分配给拆分的索引。

可以通过在作业数据上运行拆分本身。请注意,FileSplit也可以是文件(块)的部分,因此您需要检查内部offsetlength字段。拆分的类型取决于InputFormat,因此无法保证返回的拆分为FileSplit

答案 1 :(得分:0)

结果显示日志显示任务正在读取的文件。