Eclipse远程调试HDP源代码

    使用的是自己编译的HDP2.3.0的源代码编译的集群,此文介绍如何使用Eclipse远程调试Hadoop内核源代码,以调试namenode为例进行介绍。

    在/usr/hdp/2.3.0.0-2557/hadoop-hdfs/bin/hdfs.distro 目录下,添加如下内容,这个内容是让namenode在启动的时候,打开调试模式:

    image

    图片中的代码是(不要写错了):

HADOOP_OPTS="$HADOOP_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8002,server=y,suspend=n"

    然后使用脚本启动namenode进程:

[root@n124 sbin]# ./hadoop-daemon.sh --script hdfs start namenode
starting namenode, logging to /var/log/hadoop/root/hadoop-root-namenode-n124.ccsdp.com.out
Listening for transport dt_socket at address: 8002
[root@n124 sbin]# jps
7635 NameNode
7744 Jps
1944 AmbariServer
[root@n124 sbin]# pwd
/usr/hdp/2.3.0.0-2557/hadoop/sbin

这样设置以后,NameNode这个进程会监听两个端口,其中一个就是8002,如下图:

image

Eclipse中的设置如下,Debug-> Debug configurations->Remote Java Application

image

 

image

 

在eclipse中,如下位置打一个端点:

image

 

设置好Eclipse后,在shell中,使用命令行在hdfs中创建一个文件夹:

[root@n124 sbin]# hadoop fs -mkdir /user/root/zhangchao

可以看到Eclipse中的代码进入调试模式,然后就可以一步一步的进行调试,查看到每一步运行的情况:

image

 

调试的过程中,将Eclipse的进程优先级设置成Very high,可以让Eclipse的反映快不少,如果用默认的优先级,Eclipse将会非常卡:

image

在调试的过程中,发现ipc/Server.java这个文件中的,run方法,会不断的监听来自datanode的心跳数据,这个地方如果打上端点,会不断的被中断:

image

在Shell上,创建一个目录 hadoop fs -mkdir /user/zhangchao/32,然后可以在调试的过程中,发现ClientProtocol.mkdirs从客户端传递到server:

image

 

posted @ 2016-03-21 11:25  justinzhang  阅读(1713)  评论(2编辑  收藏  举报