hadoop:如何知道任务失败时处理的是什么文件?

7lrncoxx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(481)

我的工作有一些失败的任务。我想尝试和复制的文件上的任务处理,但找不到如何知道这些文件是。
如何查找任务失败时正在处理的文件?

osh3o9ms

osh3o9ms1#

我不知道这是否真的有效,但您可能想尝试一下(我是用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!");
    }
  }
}

这个想法很简单,你可以得到所有的任务事件,获取Map和失败的事件。然后您可以获得一个通常在内部分配给split的索引。
拆分本身可以通过在作业数据上运行它来获得。请注意 FileSplit 也可以是文件(块)的一部分,所以要检查内部 offset 以及 length 领域。拆分的类型取决于 InputFormat ,因此不能保证返回的拆分是 FileSplit .

ruarlubt

ruarlubt2#

将日志变灰显示任务正在读取的文件。

相关问题