为什么要学习远程debug?
以前都是在一个进程进行debug

hadoop很多进程,是一个集群,想调试某一个集群,要通过远程debug调试。hadoop是很多进程

JPDA简介
........

怎样配置远程调试
dt_socket 表示使用套接字传输
address=8000
server=y
suspend=y
需要在$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件中:
#远程调试namenode
export HADOOP_NAMENODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y(运行的时候将被挂起)"
#远程调试datanode
export HADOOP_DATANODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=9888,server=y,suspend=y(运行的时候将被挂起)"

修改完成后 重新启动
stop-dfs.sh

start-dfs.sh

jps

[root@hadoop1 ~]# jps
4400 ResourceManager
31708 -- main class information unavailable
31791 -- main class information unavailable
4492 NodeManager
2906
31900 SecondaryNameNode
32001 Jps

为什么不显示main class的信息呢?
因为main class 已经被挂起

在windows下进行调试

windows开启eclipse
只要eclipse中有源码

NameNode.class 找到main方法 debug Configuration Name:XXXX Host:192.168.8.101 Port:8888 debug

通过jps查看,发现namenode已经启动


然后找到DataNode.class
Host:192.168.8.101 Port:9888 debug

jps
已经启动datanode

 

sbin下面 hadoop-daemon.sh 单独启动一个hadoop进程
hadoop-daemon.sh start datanode 启动datanode进程


---------------------------------------------------
NameNodeRpcServer.class
找到 getBlockLocations
这是服务端,客户端调用的时候会进来

debug HDFSDemo.java