我的工作有一些失败的任务。我想尝试和复制的文件上的任务处理,但找不到如何知道这些文件是。如何查找任务失败时正在处理的文件?
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 .
FileSplit
offset
length
InputFormat
ruarlubt2#
将日志变灰显示任务正在读取的文件。
2条答案
按热度按时间osh3o9ms1#
我不知道这是否真的有效,但您可能想尝试一下(我是用hadoop 2.2编写代码的):
这个想法很简单,你可以得到所有的任务事件,获取Map和失败的事件。然后您可以获得一个通常在内部分配给split的索引。
拆分本身可以通过在作业数据上运行它来获得。请注意
FileSplit
也可以是文件(块)的一部分,所以要检查内部offset
以及length
领域。拆分的类型取决于InputFormat
,因此不能保证返回的拆分是FileSplit
.ruarlubt2#
将日志变灰显示任务正在读取的文件。