一、在hadoop调试过程,如何调试服务端代码,可以采用远程DEBUG模式进行
 
 
1、服务器端启动脚本配置debug启动参数
 
 2、执行服务端启动脚本 
 
3、通过Eclipse来远程调试服务
 
 
 
 
二、hadoop远程调试
 
 
 
 
  JPDA 简介
  
 Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技术是一个多层架构,使您能够在各种环境中轻松调试 Java 应用程序。JPDA 由两个接口(分别是 JVM Tool Interface 和 JDI)、一个协议(Java Debug Wire Protocol)和两个用于合并它们的软件组件(后端和前端)组成。它的设计目的是让调试人员在任何环境中都可以进行调试。
  
 更详细的介绍,您可以参考使用 Eclipse 远程调试 Java 应用程序
  
 JDWP 设置
  
 JVM本身就支持远程调试,Eclipse也支持JDWP,只需要在各模块的JVM启动时加载以下参数:
  
 dt_socket表示使用套接字传输。
  
 address=8000
  
 JVM在8000端口上监听请求,这个设定为一个不冲突的端口即可。
  
 server=y
  
 y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
  
 suspend=y
  
 y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。
  
 需要在$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件的最后添加你想debug的进程
  
 #远程调试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"
  
 #远程调试RM
  
 export YARN_RESOURCEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=10888,server=y,suspend=y"
  
 #远程调试NM
  
 export YARN_NODEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=10888,server=y,suspend=y"
 
 
 
 
 
三、通过Eclipse调试演示
 
 
1、分析hadoop中启动start-dfs.sh 的启动过程
 
 
 
 
  

  
  
2、在Hadoop配置DEBUG调试参数
  
  在$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件的最后添加你想debug的进程
  
 #远程调试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" 
  
  
3、启动start-dfs.sh并查看启动进程‘
  
3.1 启动后的日志
  
  

  
3.2 启动后通过jps查看进程
  
  
  
通过jps发现,两个main函数未正常执行
  
3.3 通过Eclipse下通过DEBUG方式连接上后,让等待的JVM继续执行
  
启动NameNode:
  
图一 、进入HDFS程序,在NameNode主函数上进行断点
  
  

  
  
  
  
图二、右键运行
  
  
  
图三、通过远程应用程序调用
  
  

  
  
图四、输入要远程调试的IP地址和端口号
  
  
  

  
  
图五、点击"确定“后,进行服务端的调试模式
  
  

  
  
  
图五、调试完成后,通过jps查看进程
  
  
  

  
  
发现NameNode的进程已经启动。
  
  

  
  
即NameNode启动过程:
  
new NameNode->NameNodeRPCServer rpcServer->rpcServer.start()
  
  
启动DataNode:
  
可以按照上述方法启动DataNode
  
  
  
  
  
  
  










