在很多情况下,我正在编写数据处理程序,并且只在较大的数据集上才会发现新的错误。例如,考虑一个脚本在1亿条记录中的1条中崩溃(由于意外输入或其他原因);如果我在一小部分数据上开发它,我就不会看到那个bug。我所能做的只是盯着Hadoop的错误日志,调整脚本,然后重新运行整个作业。这在计算和开发时间都非常低效。
我想要的是下载崩溃时脚本正在处理的数据段的方法。
有没有一种简单的方法可以解决Hadoop的问题? (理想情况下,Hadoop Streaming?)
几年前,我通过挖掘Hadoop本身制作的临时目录学到了一些可怕的技巧......但这似乎不是一个好的解决方案,而且我希望现在有更好的东西。
答案 0 :(得分:2)
我想要的是下载脚本崩溃时处理的数据段的方法。
“keep.failed.task.files”描述是“应该保留失败任务的文件。这应该仅用于失败的作业,因为存储永远不会被回收。它还会阻止地图输出当它们被消耗时从reduce目录中删除。“
它违约是假的。将此属性更改为true,并且在任务失败时应该可以使用数据。可以在Eclipse中轻松地将数据提供给开发人员计算机和程序debugged。
我所能做的就是盯着Hadoop的错误日志,调整脚本,然后重新运行整个作业。这在计算和开发时间都非常低效。
此外,当Hadoop作业遇到错误记录并且任务崩溃时,可以忽略该记录并重新运行map / reduce任务。无需再次运行完整的作业。有关详细信息,请查看此Hadoop documentation。
答案 1 :(得分:1)
我建议在setup(),map(),reduce()和cleanup()方法的逻辑上放置一个try-catch块。在异常的catch块中,增加一个计数器,其组是“Exception”(或其他),其名称是从异常的getMessage()方法返回的String。这将让你一眼就知道至少发生了什么。在该catch块中,您还可以向文件中写入其他信息,包括堆栈跟踪,传入的密钥和值(或可发送的信息)等。
对于调试,我也喜欢“调试为... - > Java应用程序”Eclipse中的hadoop流程。这有助于我在代码中找到并修复一堆问题。