编译及调试 Hadoop 源代码

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 后便可以看到该调试信息。

原文发布于微信公众号 - 加米谷大数据(DtinoneBD)

原文发表时间:2018-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何修改CDH集群元数据库地址

在生产环境CDH集群中会遇到元数据库的迁移,迁移后数据库的IP地址发生变化或是元数据库做主备,在主节点挂掉后,我们需要将数据库CDH集群中的元数据库地址指向新的...

37430
来自专栏Hadoop实操

如何为Hive2启用Kerberos认证

39320
来自专栏Hadoop实操

如何在CDH集群中安装Hive2.3.3

63730
来自专栏JAVA技术站

Sqoop的安装与Mysql的数据导入到hdfs框架中

Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将...

15110
来自专栏码字搬砖

CDH集成Kafka

1.离线 先下载相应版本的kafka http://archive.cloudera.com/kafka/parcels/ 然后放置相应目录,如下图...

33620
来自专栏pangguoming

CentOS 7安装Hadoop 3.0.0

最近在学习大数据,需要安装Hadoop,自己弄了好久,最后终于弄好了。网上也有很多文章关于安装Hadoop的,但总会遇到一些问题,所以把在CentOS 7安装H...

506110
来自专栏Hadoop实操

Sqoop抽数到Hive表异常分析

使用Sqoop抽取MySQL数据到Hive表时,抽取语句正常执行但数据没有写入Hive的表中,执行的Sqoop抽数脚本如下:

14010
来自专栏有困难要上,没有困难创造困难也要上!

Hadoop3-分布式模式安装

30950
来自专栏Hadoop实操

如何将CDH集群JAVA升级至JDK8

大家都知道在安装CDH时默认安装的JDK版本为jdk1.7.0_67,部分企业开发环境为JDK8版本,这个时候可能会出现在本地开发的应用在集群中无法正常运行。那...

94960
来自专栏Hadoop实操

Redhat7.4安装CDH6.0_beta1时分发Parcel异常分析

Fayson在之前的文章中介绍过《如何在Redhat7.4安装CDH6.0.0_beta1》,但当安装CDH并分发Parcel时,浏览器端会报错Parcel的h...

46720

扫码关注云+社区

领取腾讯云代金券