0

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

我在想可能会以某种方式将该数据作为字符串从 Mapper 流回到主函数,并以这种方式记录下来。这样的事情可能吗?有没有更好的方法来整合日志?

4

2 回答 2

0

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

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

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

我不确定拾取日志并输入一个地图任务的想法是否可行。因为您需要知道任务并在任务 Java 类文件中尝试 id,以便在完成后获取自己的日志文件。

于 2013-10-10T01:50:00.840 回答
0

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

使用 MultipleOutputs 的示例日志语句:

mout.write("logOutput", new Text("INFO: "), new Text("reducertest"),
                "templogging/logfile");
于 2013-10-11T20:06:24.733 回答