1

在很多情况下,我正在编写数据处理程序,并且仅在较大的数据集上才发现新的错误。例如,考虑一个在 1 亿条记录中的 1 条记录上崩溃的脚本(由于意外输入或其他原因);如果我在一小部分数据样本上开发它,我不会看到那个错误。我所能做的就是盯着 Hadoop 的错误日志,调整脚本,然后重新运行整个作业。这在计算和开发人员时间都非常低效。

我想要的是一种下载脚本崩溃时正在处理的数据段的方法。

有没有一种简单的方法可以将其从 Hadoop 中移除?(理想情况下,Hadoop Streaming?)

几年前,我通过挖掘 Hadoop 本身制作的临时目录学到了一些可怕的技巧……不过,这似乎不是一个好的解决方案,我希望现在有更好的解决方案。

4

2 回答 2

2

我想要的是一种下载脚本崩溃时正在处理的数据段的方法。

“keep.failed.task.files”描述是“是否应该保留失败任务的文件。这应该只用于失败的作业,因为存储永远不会回收。它还可以防止地图输出从减少目录,因为它们被消耗。”

它默认为假。将此属性更改为 true,如果任务失败,数据应该可用。可以将数据获取到开发人员机器上,并在 Eclipse 中轻松调试程序。

我所能做的就是盯着 Hadoop 的错误日志,调整脚本,然后重新运行整个作业。这在计算和开发人员时间都非常低效。

此外,当 Hadoop 作业遇到错误记录并且任务崩溃时,可以忽略该记录并重新运行 map/reduce 任务。无需再次运行完整的作业。查看此Hadoop 文档以获取更多详细信息。

于 2012-10-29T01:28:17.327 回答
1

我建议在 setup()、map()、reduce() 和 cleanup() 方法中围绕逻辑放置一个 try-catch 块。在 Exception 的 catch 块中增加一个计数器,其组为“Exception”(或其他),其名称是从异常的 getMessage() 方法返回的字符串。这至少会让你一目了然地知道发生了什么。在那个 catch 块中,您还可以将附加信息写入文件,包括堆栈跟踪、传入的键和值(或 utterable)等。

对于调试,我还喜欢“调试为... -> Java 应用程序” Eclipse 中的 hadoop 流。这帮助我发现并修复了我的代码中的一堆问题。

于 2012-10-28T17:49:29.403 回答