1. 修改对应调试端口
之前的一篇blog里讲述了hadoop单机版调试的方法,那种调试只限于单机运行hadoop命令而已,对于运行整个hadoop环境而言是不可取的,因为hadoop会开启多个java进程,如果统一为一个端口启动,则启动会报错说端口被占用,同时对于jdwp agent而言也只能加载一次,故调试时单机只能有一个java进程开启debug模式,其实这个也足够了。
通过分析hadoop的启动脚本不难发现,每个java进程的启动参数可以在hadoop-env.sh这个文件里传递进去,故为了增加调试选项可以在这个文件里增加如下几段:
1.#HADOOP_NAMENODE_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=8788,server=y,suspend=y"
2.#HADOOP_SECONDARYNAMENODE_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=8789,server=y,suspend=y"
3.#HADOOP_DATANODE_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=8790,server=y,suspend=y"
4.#HADOOP_BALANCER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8791,server=y,suspend=y"
5.HADOOP_JOBTRACKER_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=8792,server=y,suspend=y"
6.#HADOOP_TASKTRACKER_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=8793,server=y,suspend=y"print?
这suspend=y是必须的,表示Child子进程启动后会等待远程的debug信息发送过来后再执行代码,因此在发送debug信息之前我们可以在eclipse中下断点,这一点很重要。
这里因为是单机运行一些java进程,故这里只保留一个进程开启debug模式,当有多个机器单独运行每个java进程时,可以按照功能来打开相对应的java debug模式。如jobtracker和tasktracker运行在不同机器,即可观察。
bin/start-all.sh
如果脚本运行成功,可以看到shell命令行终端显示如下信息:
Listening for tranport dt_socket ataddress:8792
这时候表示JobTracker成功处于监听状态。JobTracker将一直处于监听状态,直到收到debug确认信息。所以此处eclipse的监听调试端口还未建立。
但是此时jobtracker尚未启动。
注释:只有在第三步输入远程端口,点击“Debug”按钮,jobTracker才启动,所以在hadoop源码中添加断点,运行一个job,程序就会自动暂停到断点位置,接下来再详细的操作见第三步。
2.在eclipse里导入源码
新建Java工程。打开eclipse,进入eclipse界面,依次单击File——New——Java Project,并在弹出的对话框中取消选择“Use Defaultlocation”前面的勾号,然后选择hadoop安装目录的位置,默认情况下,工程名称与hadoop安装目录名称相同,可自行修改。
在下一个界面设置,将下方的 Default outputfolder由 .../bin更改为.../build/eclipse-classes(或其他),以免 eclipse自动清空 bin 文件夹下手工编写的文件;点击 Finish按钮等待下载完成。此时会有很多文件标有红色叉号,属正常现象。
3. 配置eclipse来远程调试
启动eclipse,点击菜单的 Go to Run -> Debug Configurations在配置界面上找到Remote JavaApplication然后右键新建一个,并配置远程应用的链接信息(如对应Jobtracker的端口)
这里主要是填好主机名及对应打开调试的端口号。
最后一步点击 Apply保持配置然后点击Debug即可开始远程调试了
注意的是调试要选用Debug perspective。
4.设置一些断点,比如
远程调试JobTracker时,将断点设置在JobTracker.submitJob函数中。(左边双击代码JobTracker.java)
比如,
上传文件:hadoop fs –mkdirinput
Hadoop fs -put file1.txt input
运行wordcount例子:
Hadoop jar hadoop-example.jar wordcount inputoutput
运行过程中,因为设置了断点,会提示打开eclipse Debug perspective,可以看到程序中止的地方,可以查看相应文件夹下的变化,按F8可跳过断点继续执行程序。
参考另一篇文章,就会通过设置断点的方式,来观察hadoop的运行的轨迹。