我如何整合hadoop日志?

时间:2013-10-08 20:00:39

标签: java hadoop mapreduce

我目前有一个程序,除其他外 - 产生日志输出。问题是映射器似乎都想要记录到它们运行的​​任何地方。我希望所有这些日志输出最终都在一个文件中。我正在使用log4j来记录信息。

我当时认为以某种方式将数据作为字符串从Mapper以某种方式传回主函数可能是可能的,并以这种方式记录它。这样的事情可能吗?有没有更好的方法来整合日志?

2 个答案:

答案 0 :(得分:0)

每个map或reduce任务的日志都写入执行它们的任务跟踪器节点的本地文件系统。日志写入'userlog'目录,该目录由HADOOP_LOG_DIR定义,子目录由任务尝试ID命名。

可以通过作业跟踪器Web GUI访问这些日志文件,在每个任务详细信息页面中,都有一个链接可以单击以检查日志内容。但是从最初的Apache Hadoop版本,据我所知,没有任何工具或机制可以合并来自不同节点的日志。

虽然有些供应商可能有自己的实用程序用于此目的,但我最近发现了这个,来自MapR,这似乎是一个很好的解决方案,但我没有自己尝试,http://doc.mapr.com/display/MapR/Centralized+Logging

我不确定拾取日志和提取到单个地图任务的想法是否有效。因为您需要知道任务Java类文件中的任务和尝试ID,以便在完成后获取自己的日志文件。

答案 1 :(得分:0)

好的,我最终通过使用MultipleOutputs解决了这个问题。我为实际输出设置了一个流,一个用于生成我的代码的日志结果。这允许我通过日志输出流发送输出来手动记录事物。然后我有一个脚本将日志文件合并到一个文件中。虽然自动生成的日志保留在最初的位置,但这个解决方案允许我将我放入代码的日志消息发送到一个位置。

使用MultipleOutputs的示例日志语句:

mout.write("logOutput", new Text("INFO: "), new Text("reducertest"),
                "templogging/logfile");