1.3.2 断点调试代码
本节主要介绍远程断点调试代码。进行远程断点调试时,首先需要部署一套Hadoop环境,伪分布式和分布式都可以。当然,也可以远程断点调试线上环境。其次,要保证1.3节开头所讲的源码阅读环境正常。
远程断点调试代码分为三步:第一步是在远程代码端设置一些Java启动参数,第二步是在IDEA中设置远程服务的IP地址与端口,第三步是在远程代码服务器上启动相关进程,然后在IDEA中进行断点调试。
假如要调试Hadoop命令,需先在HADOOP_HOME/bin/hadoop文件中添加如下代码:
HADOOP_OPTS="$HADOOP_OPTS -Xdebug -
Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888"
添加之后的结果如下:
HADOOP_OPTS="$HADOOP_OPTS -
Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,NullAppender}"
# 将代码添加在下面
HADOOP_OPTS="$HADOOP_OPTS -Xdebug -
Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888"
export CLASSPATH=$CLASSPATH
# 执行Hadoop相关命令
exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
然后执行Hadoop命令,例如hadoop fs -ls /tmp
,此时ls
的执行过程会被卡住,提示Listening for transport dt_socket at address: 8888
,这表明端口8888处于监听状态,可以接收来自IDEA的断点调试请求。
接着在IDEA中找到要进行断点调试的主类,如果执行Hadoop命令时输入的参数是fs
,则在HADOOP_HOME/bin/hadoop文件中找fs
对应的主类FsShell
,代码如下:
if [ "$COMMAND" = "fs" ] ; then CLASS=org.apache.hadoop.fs.FsShell
在IDEA中找到FsShell
主类(可以通过快捷键Command+O或者Ctrl+N)之后,配置其远程断点调试。具体步骤为选择Run
→Edit Configurations
,在弹出的页面左上角处单击加号+,然后添加Remote选项,如图1-8所示。
图1-8 添加Remote选项
添加Remote选项之后,对其进行简单修改就行,这里主要修改Host、Port和module's classpath。将Name改为FsShell,这是为了与其他任务进行区分,因为Name的默认值为Unnamed。将Host改为远程服务器的IP地址或者主机名,Port改为远程服务设置的端口,这两个值是在HADOOP_HOME/bin/hadoop文件中配置的IP地址和端口。将module's classpath改为FsShell所在的模块包,如图1-9所示。
图1-9 修改Remote选项
修改好之后,就可以设置断点进行远程断点调试了。