调试 Hadoop 源代码

Posted 秦时明月0515

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调试 Hadoop 源代码相关的知识,希望对你有一定的参考价值。

环境是 64bit Ubuntu 14.04 系统, jdk 1.7 以及 Eclipse Mars (4.5)   

  这里介绍两种调试 Hadoop 源代码的方法: 利用 Eclipse 远程调试工具和打印调试日志. 这两种方法均可以调试伪分布式工作模式和完全分布式工作模式下的 Hadoop.

  (1) 利用 Eclipse 进行远程调试

  下面以调试 ResourceManager 为例, 介绍利用 Eclipse 远程调试的基本方法, 这可分两步进行.

  步骤 1  调试模式下启动 Hadoop.

  在 Hadoop 安装目录下运行如下的 Shell 脚本:

$ export YARN_NODEMANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8788,server=y,suspend=y"
$ sbin/start-all.sh       # 在 /usr/local/hadoop  目录下

  运行了脚本后会看到 Shell 命令行终端显示如下信息:

$ Listening for transport dt_socket at address: 8788

  此时表明 ResourceManager 处于监听状态, 直到收到 debug 确认信息.

  步骤 2  设置断点 

  在新建的 Java 工程 "hadoop-main" 中, 找到 ResourceManager 相关代码, 并在感兴趣的地方设置一些断点.

  步骤 3  在 Eclipse 中调试 Hadoop 程序.

  在 Eclipse 的菜单中, 依次选择 "Run" --> "Debug Configurations" --> "Remote Java Applications",  并按照要求填写远程调试器名称(自己定义一个即可), ResourceManager 所在 host 以及监听端口号等信息, 并选择 Hadoop 源代码工程, 便可进入调试模式.

  调试过程中, ResourceManager 输出的信息被存储到日志文件夹下的 yarn-XXX-resourcemanager-localhost.log 文件 ( XXX 为当前用户名 ) 中, 可通过以下命令查看调试过程中打印的日志:

$ tail -f logs/yarn-XXX-resourcemanager-localhost.log    # 在hadoop源代码目录下

  (2) 打印 Hadoop 调试日志

  Hadoop 使用了 Apache log4j 作为基本日志库, 该日志库将日志分为5个级别, 分别是 DEBUG, INFO, WARN, ERROR 和 FATAL. 这5个级别是有顺序的, 即 DEBUG < INFO < WARN < ERROR < FATAL, 分别用来指定日志信息的重要程度. 日志输出规则为: 只输出级别不低于设定级别的日志信息, 比如若级别设定为 INFO, 则 INFO, WARN, ERROR 和 FATAL 级别的日志信息都会输出, 但级别比 INFO 低的 DEBUG 则不会输出.

  在 Hadoop 源代码中, 大部分 Java 文件中存在调试日志 ( DEBUG 级别日志 ), 但默认情况下, 日志级别是 INFO, 为了查看更详细的运行状态, 可采用以下几种方法打开 DEBUG 日志.

  方法 1  使用 Hadoop Shell 命令.

  可使用 Hadoop 脚本中的 daemonlog 命令查看和修改某个类的日志级别, 比如, 可通过以下命令查看 NodeManager 类的日志级别: ( 如果你的主机是 node1, ip是192.168.1.101, 而且已经绑定了, host 写这两个中的一个即可 )

$ bin/hadoop daemonlog -getlevel ${nodemanager-host}:8042 org.apache.hadoop.yarn.server.nodemanager.NodeManager

  可通过以下命令将 NodeManager 类的日志级别:

$ bin/hadoop daemonlog -setlevel ${nodemanager-host}:8042 org.apache.hadoop.yarn.server.nodemanager.NodeManager DEBUG

  其中, nodemanager-host 为 NodeManager 服务所在的 host, 8042 是 NodeManager 的 HTTP 端口号.

  方法 2  通过 Web 界面.

  用户可以通过 Web 界面查看和修改某个类的日志级别, 比如, 可通过以下 URL 修改 NodeManager 类的日志级别:

http://${nodemanager-host}:8042/loglevel

  方法 3  修改 log4j.properties 文件.

  以上两种方式只能暂时修改日志级别, 当 Hadoop 重启后会被重置, 如果要永久性改变日志级别, 可在目标节点配置目录下的 log4j.properties 文件中添加以下配置选项:

$ log4j.logger.org.apache.hadoop.yarn.server.nodemanager.NodeManager=DEBUG

 

以上是关于调试 Hadoop 源代码的主要内容,如果未能解决你的问题,请参考以下文章

调试 Hadoop 源代码

windows下本地调试hadoop代码,远程调试hadoop节点。

Hadoop学习九:hdfs源代码调试

Hadoop学习九:hdfs源代码调试

方便调试使用的代码片段

运行/调试你的PHP代码