从失败的Hadoop作业中恢复标准

时间:2011-12-07 19:30:18

标签: streaming hadoop

我正在运行一个大型的Hadoop流式传输作业,我处理大量文件,每个文件作为一个单元处理。为此,我对流媒体作业的输入是一个文件,其中包含所有文件名列表。

总的来说,这很有效。但是,我遇到了一个问题,当Hadoop遇到一些有问题的文件时,我部分通过大量工作(~36%),并且由于某种原因,它似乎导致整个工作崩溃。如果作业已经成功完成,那么打印到标准输出的内容将是每个文件的一行,因为它已经完成以及我的程序中处理每个文件的一些统计数据。但是,如果这个失败的作业,当我尝试查看本已发送到标准输出的输出时,它是空的。我知道大约36%的文件都是处理过的(因为我将数据保存到数据库中),但是我不容易生成一个列表,列出哪些文件已成功处理,哪些文件仍然存在。无论如何都要将此日志恢复到标准输出?

我可以做的一件事是查看已完成/失败任务的所有日志文件,但这对我来说似乎更难,我不知道如何以这种方式检索文件的好/坏列表

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

Hadoop在此处捕获system.out数据:

的/ mnt / hadoop的/日志/ userlogs / TASK_ID

但是,我发现这不可靠,Hadoop的工作通常不会使用标准输出进行调试,而是使用计数器进行对话。

对于每个文档,您可以总结文档特征:如长度,正常ascii字符数,新行数。

然后,您可以拥有2个计数器:“好”文件的计数器和“坏”文件的计数器。

可能很容易注意到坏文件有一些共同点[没有数据,数据太多,或者某些不可打印的字符]。

最后,您显然必须在作业完成后查看结果。

当然,使用system.out语句的问题是,在各种计算机上运行的作业无法集成其数据。计数器可以解决这个问题 - 它们很容易整合到一个清晰准确的整体工作中。

当然,计数器的问题在于信息内容完全是数字的,但是,只要有一点创造力,您就可以轻松找到以有意义的方式定量描述数据的方法。

最糟糕的情景:你真的需要文本调试,而你不想在临时文件中

在这种情况下,您可以使用MultipleOutputs写出包含其他数据的辅助文件。您可以使用与part-r-0000 *数据相同的方式向这些文件发出记录。

最后,我认为你会发现,具有讽刺意味的是,必须使用计数器的限制将增加你的工作的可读性:一旦你考虑它,它是非常直观的,使用数字计数调试而不是原始文本-​​--我经常发现,在调整原始信息内容时,我的大部分调试打印语句基本上只是计数器......