Hadoop 3实战指南
上QQ阅读APP看书,第一时间看更新

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)之后,配置其远程断点调试。具体步骤为选择RunEdit 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选项

修改好之后,就可以设置断点进行远程断点调试了。