之前一直不清楚MapReduce阶段System.out打印到哪儿去了。现在知道了,任务分发了节点后,是无法再客户端窗口查看的。要想查看,需要打开默认关闭的JobHistoryServer进程。存放在每个节点的Hadoop安装目录/logs/userlogs/…在Web UI中也能查看。下面是转载的学习笔记。

  转载自《http://blog.csdn.net/infovisthinker/article/details/45370089》,补充资料:《http://dongxicheng.org/mapreduce-nextgen/hadoop-logs-placement/和《http://blog.csdn.net/uniquechao/article/details/26449761》

  补充配置 mapred-site.xml

<property><name>mapreduce.jobhistory.address</name><value>master:10020</value>
</property>
<property><name>mapreduce.jobhistory.webapp.address</name><value>master:19888</value>
</property>
<property><name>mapreduce.jobhistory.intermediate-done-dir</name><value>${yarn.app.mapreduce.am.staging-        dir}/history/done_intermediate</value>
</property>
<property><name>mapreduce.jobhistory.done-dir</name><value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>

  yarn-site.xml

<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>Configuration to enable or disable log aggregation</description>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp/hadoop-yarn/staging</value>
</property><property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/hadoop-yarn/aggrelogs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>259200</value>
</property>
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>3600</value>
</property>

  Hadoop 2.6包含两个大部分:DFS和Yarn,而Yarn里面又包含在Resource Manager的JVM中运行的部分和在Node Manager里面运行的JVM部分。所以整个系统(不考虑加装ZooKeeper的HA的情况)的log是分别放在3个log里面的。

1. 对于DFS的log,在Name Node和Data Node里面,默认可以在${HADOOP_INSTALL}/logs里面看到。这个是非DFS的文件,直接可以通过Linux文件系统看到。

2. 对于Yarn的log,在Resource Manager和Node Manager里面,默认可以在${HADOOP_INSTALL}/logs里面看到。这个也是非DFS的文件,直接可以通过Linux文件系统看到。

3. 对于MapReduce任务的log,情况就比较的复杂了。在2.6里面,task是按照application->container的层次来管理的,所以在Name Node机器上运行mapreduce程序的时候,在console里面看到的log都可以通过在相应的data node/node manager里面的${HADOOP_INSTALL}/logs/userlogs下面找到。这个部分也是非DFS文件,直接可以通过Linux文件系统看到。这些log也可以通过Hadoop Web管理页面看到,比较方便。

  网络上搜来的信息基本都是关于上面这些部分的。可对于一个开发人员而言,上面这些log对于调试程序的帮助就不大了。Java程序员会经常要用System.out/err来输出中间内容到standard output,而且工业界早就用logger来记录系统状态和帮助调试了。那么我们在mapreduce程序体里面怎么来得到这些log哪。

  首先讲讲System.out的输出,这个网络上的介绍还算详细。基本来说在main方法里面的部分都可以在console上输出。这一点不管是在Eclipse里面通过插件链接DFS运行on MapReduce的时候,还是直接在namenode上跑jar包,都可以看的到。直接编程读写DFS的程序也能够通过这个方法来看到中间结果和调试程序。而上面也说了,因为这个task的部分是运行在resource manager的启动的JVM里面(这个部分不是很确定,也许是单独启动的一个JVM),所以System.out的输出可以看到。而一旦程序进入Mapper和Reducer的部分,这个时候,任务是分发到datanode的机器里面跑,那里的JVM的输出就不会再返回到task的JVM了,所以在Mapper和Reducer里面的System.out输出是无法看到的。

  那么这个时候怎么来写log哪?网络搜索的结果基本给了3个方法:1. 用log4j来生成logger;2. 用apache common里面的LogFactory生成logger;3. 用MultipleOutput来自己写log输出。1和2本质是一样的,只是调用现成的Logger类。3是要自己管理log文件的生成和输出,灵活但是很累。

  现在最关键的问题来了。我用Log4j或者LogFactory的Logger输出的log文件在哪里?搜了一天,基本讲的都语焉不详,特别是针对Hadoop 2.6的,没有找到。综合了几个帖子,终于发现了问题所在。为了能看到Logger输出的内容,需要做如下几件事:

1. 在启动Hadoop集群的时候,除了start-yarn.sh和start-dfs.sh,还要启动historyserver,命令是

1 mr-jobhistory-daemon.sh start historyserver

mr-jobhistory-daemon.sh命令是在${HADOOP_INSTALL}/sbin/目录下面。启动完了,用jps命令可以看到有JobHistoryServer的进程启动。启动了HistoryServer后,就可以看到Tracking URL里面的History了。

还能在Hadoop Web管理界面里看到每个Job的历史Map和Reduce任务,以及每个任务所在的datanode。

点击Maps和Reduces后面的数字link,就能看到每个任务运行的情况。

但是当去点击log的链接的时候,会碰到Aggregation function is not enabled错误。为了能看到每个Map和Reduce任务的Log,还必须在yarn-site.xml里面配置aggregation为true。

  <property><name>yarn.log-aggregation-enable</name><value>true</value><description>Configuration to enable or disable log aggregation</description></property>

然后将yarn-site.xml同步到所有的节点,在重启集群。这个时候再点击上面那个logs链接,就可以看到每个任务的log了,而Logger们输出的内容也在里面!!

到了这里,就只剩下一个问题了。这个log文件在哪里?查看yarn-site.xml后终于发现了MapReduce任务的log的位置。

 <property>    <name>yarn.nodemanager.remote-app-log-dir</name><value>/logs</value><description>HDFS directory where the application logs are moved on application completion. Need to set appropriate permissions. Only applicable if log-aggregation is enabled. The default value is "/logs" or "/tmp/logs" </description></property>

注意红色字的部分,这里清楚的指明了这个log是存放在HDFS文件系统里面的,不是放在Linux文件系统里面的。在hdfs://namenode/logs/hadoop/logs里面,终于发现了每个任务对应的log文件夹。每个任务文件夹里有两个文件。分别对应的Map任务和Reduce任务。

[hadoop@SXV2V999 ~]$ hdfs dfs -ls hdfs://namenode/logs/hadoop/logs/application_1430285399789_0001
15/04/29 23:02:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r-----   2 hadoop supergroup      58369 2015-04-29 13:32 hdfs://namenode/logs/hadoop/logs/application_1430285399789_0001/<strong><em>hostname</em></strong>_39575
-rw-r-----   2 hadoop supergroup     399834 2015-04-29 13:32 hdfs://namenode/logs/hadoop/logs/application_1430285399789_0001/<strong><em>hostname</em></strong>_54053 

hostname部分是对应的datanode的hostname。

在Web页面里显示的也就是从这两个文件里读取并排版的。自此每个log文件的具体位置终于水落石出。

个人心得,有错误和不全面的地方欢迎拍砖。

转载于:https://www.cnblogs.com/wangrd/articles/6137748.html

[转载]Hadoop 2.X 日志文件和MapReduce的log文件研究心得相关推荐

  1. Eclipse启动失败,提示查看.metadata文件夹下的.log文件

    Eclipse启动失败,提示查看.metadata文件夹下的.log文件 附上一些网上通用解决方法,方便以后查找: 尝试方法一:workspace目录下的.metadata目录整个删除.结果:未成功. ...

  2. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列三(log文件的存放路径)

    前言 前面一直在说,如何读取到log4j 的配置文件 log4j.properties. 接下来的探讨的是: log4j 里配置产生的log 文件的路径如何设置. tomcat 还好.拿复杂点的 we ...

  3. linux apache 大文件,Apache下error.log文件太大的处理方法

    Apache下error.log文件太大的处理方法 2019年05月03日 | 萬仟网网络运营 | 我要评论 清除error.log.access.log并限制apache日志文件大小的方法 有个客户 ...

  4. shell脚本将mysql数据库中查询结果导出制作成.CSV格式文件;或.txt/.log文件

    #第一种方法在命令行中直接执行下面代码(.log可替换为其他格式文件) mysql -hlocalhost -P3306 -uroot -p1234 -e"select * from dem ...

  5. linux清理日志 hack,Linux系统的LOG日志文件及入侵后日志的清除

    UNIX网管员主要是靠系统的LOG,来获得入侵的痕迹.当然也有第三方工具记录入侵系统的 痕迹,UNIX系统存放LOG文件,普通位置如下: /usr/adm - 早期版本的UNIX /var/adm - ...

  6. ubuntu 查询程序崩溃日志_ubuntu查看系统日志及相关文件介绍

    1.在ubuntu服务器上,日志是通过syslogd进程处理的.该进程读取如下配置文件: 该文件主要配置哪些信息需要记录日志,记录到什么地方. 在该配置文件的第一部分,是对系统设施日志的配置,主要有: ...

  7. Python3 日志同时输出到控制台和文件

    python3中想要将程序的日志打印到文件中,便于后期查看原因.但是在开发阶段又想让日志打印到控制台,这时候可以用一个类将其封装起来,用法就跟java差不多,配置也很简单. 需要用到python内置模 ...

  8. mysql重做日志与binlog日志区别_MySQL日志之binlog、redo log、undo log

    1. binlog(二进制日志) 1.1 binlog介绍 binlog记录了对数据库执行更改的所有操作(不包括查询),还包括了执行数据库更改操作的时间和执行时间等信息.binlog主要有两个作用:恢 ...

  9. mysql innodb 文件_MySQL与InnoDB相关文件

    原标题:MySQL与InnoDB相关文件 上期回顾 <InnoDB存储引擎> 概要 本章将会分析构成MySQL数据库和InnoDB存储引擎的各种类型文件,这些文件有如下几种: 参数文件:主 ...

最新文章

  1. 报错解决: error: this use of defined may not be portable
  2. 如何将OutputStream转换为InputStream?
  3. mysql修改字段类型为smallint_mysql更新 unsigned 的 smallint 类型字段出现65535
  4. 内嵌资源html,内嵌元素(HTML)
  5. 【Vegas原创】X connection to localhost:11.0 broken (explicit kill or server shutdown)解决方法...
  6. python中的可变数据类型有列表和元组_Python中列表的 += 和 .extend() 的异同
  7. 代码评审会议_如何将电话会议(和访问代码)另存为联系人
  8. 前端学习(555):margin与容器的尺寸
  9. 牛客16589 机器翻译
  10. Web 开发中 20 个很有用的 CSS 库
  11. 中国主要山脉及山峰分布
  12. 爬虫3_获取汇率数据
  13. [GAMES101]现代计算机图形学课程总结3:Shading
  14. KrbException: Clock skew too great (37) - PREAUTH_FAILED问题解决与服务器时钟同步
  15. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第一周作业
  16. pr导出视频在哪里?
  17. 天津教育杂志天津教育杂志社天津教育编辑部2022年第30期目录
  18. CentOS 6.4下通过Rdo方式安装OpenStack
  19. ios 判断数字开头_iOS 判断首字母是否大写 判断身份证 判断纯数字 判断纯汉字...
  20. Oracle入门笔记(三)——Oracle数据类型

热门文章

  1. python 传奇服务端_传奇游戏服务器源码学习
  2. python list find函数_对python中list的五种查找方法说明
  3. 查询 mysql所有表名
  4. Java文档对象_java从文件读取对象
  5. mysql cursor 字符集_两个MySQL存储过程中文问题的解决方案
  6. MySQL保存计算结果_在数据库中保存计算结果如何对应到相应的工程文件
  7. python元组是有序还是无序_python-03 元组和字典
  8. Android4火狐,Android版火狐4正式发布
  9. 照片浏览器_2020护考报名失败!只因照片太大瞎忙乎三小时...
  10. 机器学习中的算法:决策树模型组合之GBDT(Gradient Boost Decision Tree)