Hadoop 在伪分布式模式下的编译和调试方法,其中,调试方法主要介绍使用 Eclipse 远程调试和打印调试日志两种。
编译 Hadoop 源代码
在 Windows 或 Linux 环境下,打开命令行终端,转到 Hadoop 安装目录下并输入以下命令:
ant -Dversion=1.0.0 {target}
其中,{target} 值如表 1-2 所示,不同的 target 可对应生成不同的 jar 包,如:
ant -Dversion=1.0.0 examples
可生成 hadoop-examples-1.0.0.jar,产生的 jar 包位于 Hadoop 安装目录的 build 文件
夹下。
调试 Hadoop 源代码
利用 Eclipse 远程调试和打印调试日志。这两种方式均可以调试伪分布式工作模式和完全分布式工作模式下的 Hadoop。主要介绍伪分布式工作模式下的 Hadoop 调试方法。
1. 利用 Eclipse 进行远程调试
下面以调试 JobTracker 为例,介绍利用 Eclipse 进行远程调试的基本方法。调试过程可分三步进行:
步骤 1:调试模式下启动 Hadoop在 Hadoop 安装目录下运行内容如下的 Shell 脚本:
export HADOOP_JOBTRACKER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=878
8,server=y,suspend=y"
bin/start-all.sh
如果脚本运行成功,则可以看到 Shell 命令行终端显示如下信息:
Listening for transport dt_socket at address: 8788
此时表明 JobTracker 处于监听状态。JobTracker 将一直处于监听状态,直到收到 debug确认信息。
步骤 2: 设置断点
在前面新建的 Java 工程“hadoop-1.0.0”中,找到JobTracker 相关代码,并在感兴趣的地方设置一些断点。
步骤 3 :在 Eclipse 中调试 Hadoop 程序在 Eclipse 的菜单栏中,依次单击“Run”→“Debug Configurations”→“Remote Java
Applications”,打开图 1-19 所示的对话框,按图中的提示填写名称、JobTracker 所在的host 以及监听端口,并选择 Hadoop 源代码工程,进入图 1-20 所示的调试模式
调试过程中,JobTracker 输出的信息被存储到日志文件夹下的 hadoop-XXX-jobtrackerlocalhost.log 文件(XXX 为当前用户名)中,可通过以下命令查看调试过程中打印的日志:
tail -f logs/hadoop-XXX-jobtracker-localhost.log
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 命令查看和修改某个类的日志级别,比如,可通过以下命令查看 TaskTracker 类的日志级别:
bin/hadoop daemonlog -getlevel ${tasktracker -host}:50075 \
org.apache.hadoop.mapred.TaskTracker
可通过以下命令将 JobTracker 类的日志级别修改为 DEBUG:
bin/hadoop daemonlog -setlevel ${tasktracker-host}:50075 \org.apache.hadoop.mapred.TaskTracker DEBUG其 中,tasktracker-host 为 TaskTracker 的 host,50075 是 TaskTracker 的 HTTP 端 口 号(其他服务的 HTTP 端口号可参考附录 B)。
(2)通过 Web 界面
用户可以通过 Web 界面查看和修改某个类的日志级别,比如,可通过以下 URL 修改TaskTracker 类的日志级别:
http://${tasktracker-host}:50075/logLevel
(3)修改 log4j.properties 文件
以上两种方法只能暂时修改日志级别。当 Hadoop 重启后会被重置,如果要永久性改变日志级别,可在目标节点配置目录下的 log4j.properties 文件中添加以下配置选项:
log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG
此外,有时为了专门调试某个 Java 文件,需要把该文件的相关日志输出到一个单独文件中,可在 log4j.properties 中添加以下内容:
# 定义输出方式为自定义的 TTOUT
log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG,TTOUT
# 设置 TTOUT 的输出方式为输出到文件
log4j.appender.TTOUT =org.apache.log4j.FileAppender
# 设置文件路径
log4j.appender.TTOUT.File=${hadoop.log.dir}/TaskTracker.log
# 设置文件的布局
log4j.appender.TTOUT.layout=org.apache.log4j.PatternLayout
# 设置文件的格式
log4j.appender.TTOUT.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
这些配置选项会把 TaskTracker.java 中的 DEBUG 日志写到日志目录下的 TaskTracker.og 文件中。
在阅读源代码的过程中,为了跟踪某个变量值的变化,读者可能需要自己添加一些DEBUG 日志。在 Hadoop 源代码中,大部分类会定义一个日志打印对象。通过该对象,可打印各个级别的日志。比如,在 JobTracker 中由以下代码定义对象 LOG:public static final Log LOG = LogFactory.getLog(JobTracker.class);
用户可使用 LOG 对象打印调试日志,比如,可在 JobTracker 的 main 函数首行添加以下代码:
LOG.debug("Start to lauch JobTracker...");然后重新编译 Hadoop 源代码,并将 org.apache.hadoop.mapred. JobTracker 的调试级别修改为 DEBUG,重新启动 Hadoop 后便可以看到该调试信息。