调试hadoop map reduce作业是一件痛苦的事。我可以打印到stdout,但是这些日志显示在运行mr作业的所有不同机器上。我可以去jobtracker,找到我的工作,然后单击每个Map器来访问它的任务日志,但是当你有20多个Map器/还原器时,这是非常麻烦的。
我在想,我可能需要编写一个脚本,通过job tracker找出每个mapper/reducer运行在哪台机器上,然后scp日志回到一个中心位置,在那里它们可以被分类在一起。在我浪费时间做这件事之前,有没有人知道一个更好的方法,为作业的Map器和还原器获得一个统一的标准输出日志?
3条答案
按热度按时间fkvaft9z1#
我的经验是,当您确切地知道是什么map/reduce尝试导致了要通过日志检查的问题时,您不需要单击20+个map/reduce输出链接。这就是为什么我总是在抛出异常或递增计数器时使用context.setstatus(“warn message here”)来引起怀疑。
有关设置状态的更多信息:http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/taskinputoutputcontext.html#setstatus(java.lang.string)
https://www.inkling.com/read/hadoop-definitive-guide-tom-white-3rd/chapter-5/running-on-a-cluster (调试作业部分)
w46czmvw2#
我是这样做的:
对于一般调试(即测试作业是否正常工作),我在本地计算机上以独立模式运行hadoop,并提供少量数据样本。通过这种方式,hadoop与其他java应用程序一样工作,并在控制台中显示Map器或还原器的标准输出。
对于特定的bug(例如,作业在本地机器上运行良好,但在生产中会死掉),我只需调整代码,将调试时通常发送给stdout的内容作为作业的输出。这样您就可以检查作业的结果以获得调试细节。这不漂亮,但效果很好。
另一个选项是在jobtracker中检查节点的日志。他们有所有的标准和标准。但是,由于几个原因,我发现这比上面描述的解决方案要复杂得多(日志在一段时间后被删除,需要查找几个节点,等等)
htzpubme3#
所以我最终只是创建了一个python脚本来实现这一点。这并不可怕。这是剧本,以防别人用。显然,它需要更多的错误检查,而不是硬编码的网址,等等,但你得到的想法。注意,你需要下载靓汤