1.调试环境
1.1 远程linux运行的hadoop
1.2 本地windows的eclipse中导入hadoop源代码
1.3 本地windows的eclipse中有hadoop的自己写的代码
2.步骤
2.1修改远程linux运行的hadoop程序的hadoop-env.sh,
把第21行注释掉,增加一行代码
export HADOOP_NAMENODE_OPTS=
"-Xdebug -Xrunjdwp:transport=dt_socket,address=9090,server=y,suspend=y"
2.2 在本地windows的eclipse中导入hadoop的源代码,在对应的NameNode类上增加断点,然后使用debug方式运行,具体配置见截图,这样要调试的本地代码就和服务端关联上
2.3 在本地windows的eclipse中使用debug方式运行自己写的代码。
3 详细解释如下:
3.1 配置文件hadoop-env.sh的说明
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS" ---> 启动namenode参数
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS" ---> 启动secondnamenode参数
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS" ---> 启动datanode参数
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS" ---> 启动balancer 负载参数
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS" ---> 启动jobtracker参数
调试namenode因此需要修改namenode启动参数:
#export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS" ---> 注释掉原来启动写法
export HADOOP_NAMENODE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=9090,server=y,suspend=y"
-Xdebug 以debug方式启动
-Xrunjdwp: 引出如下选项参数
transport=dt_socket, 传输方式
address=9090, 访问端口,端口可以改动,设置为9090后在启动Hadoop集群下监听此端口等到客户端访问
server=y, 远程调试下,设置Hadoop作为服务器端
suspend=y 设置为追加模式
调试那种类型的节点,仅需要将:
export HADOOP_NAMENODE_OPTS=
"-Xdebug -Xrunjdwp:transport=dt_socket,address=9090,server=y,suspend=y"
修改成对应类型节点即可 eg: debug jobtracker
export HADOOP_JOBTRACKER_OPTS=
"-Xdebug -Xrunjdwp:transport=dt_socket,address=9090,server=y,suspend=y"
3.2 启动Hadoop集群后 namenode jps结果如下:
[root@master bin]# jps
16254 SecondaryNameNode
16330 JobTracker
16563 Jps
Could not synchronize with target // 表示等待监听 连接debug端口即可解决 这里我们在eclipse中debug代码即可 ,连接后如下
[root@master bin]# jps
16254 SecondaryNameNode
18518 Jps
16330 JobTracker
16109 NameNode
3.3 在namenode修改hadoop-env.sh后启动集群,输出日志如下 看下图可以看到监听启动:
eclipse 将客户端代码和Hadoop源码关联设置如下:
eclipse中debug FileSystemHdfs,在nomenode下增加断点 效果显示如下: