远程调试技巧

来源:互联网 发布:有线网络正常没网速 编辑:程序博客网 时间:2024/06/09 21:42

http://qq85609655.iteye.com/blog/2193931


了解程序运行过程,除了一行行代码的扫射源代码。更快捷的方式是运行调试源码,通过F6/F7来一步步的带领我们熟悉程序。针对特定细节具体数据,打个断点调试则是水到渠成的方式。

 

Java远程调试

Java代码  收藏代码
  1. * JDK 1.3 or earlier -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006  
  2. * JDK 1.4(linux ok) -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006  
  3. * newer JDK(win7 & jdk7) -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006  

同一操作系统任务提交

 

windows提交到windows,linux提交到linux,可以直接通过命令行添加参数调试wordcount任务:

Java代码  收藏代码
  1. E:\local\dotfile>hdfs dfs -rmr /out # native-lib放在非path路径下,cmd脚本中有对其进行处理  
  2.   
  3. E:\local\dotfile>hadoop org.apache.hadoop.examples.WordCount  "-Dmapreduce.map.java.opts=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8090 -Djava.library.path=E:\local\libs\big\hadoop-2.2.0\lib\native -Dmapreduce.reduce.java.opts=-Djava.library.path=E:\local\libs\big\hadoop-2.2.0\lib\native"  /in /out  

suspend设置为y,会等待客户端连接再运行。在eclipse中在WordCount$TokenizerMapper#map打个断点,然后再使用Remote Java Application就可以调试程序了。

 

Hadoop集群环境下调试任务

 

hadoop有很多的程序,同样有对应的环境变量选项来进行设置!

 

主程序-调试Job提交

set HADOOP_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8090"

可以在配置文件中进行设置。需要注意可能会覆盖已经设置的该参数的值。

Nodemanager调试

set HADOOP_NODEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8092"

(linux下需要定义在文件中)YARN_NODEMANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8092"

ResourceManager调试

HADOOP_RESOURCEMANAGER_OPTS

export YARN_RESOURCEMANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8091"

Linux上的设置略有不同,通过SSH再调用的进程(如NodeManager)需要把其OPTS写到命令行脚本文件中!! linux需要远程调试NodeManager的话,需要写到etc/hadoop/yarn-env.sh文件中!不然,nodemanger不生效(通过ssh去执行的)!

 

其他调试技巧

 

调试测试集群环境,比本地windows开发环境复杂点。毕竟本地windows的就一个主一个从。而把任务放到分布式集群上时,例如调试分布式缓存的! 那么就需要一些小技巧来获取任务运行所在的机器!下面的步骤中有具体操作命令。

 

任务配置及运行

 

eclipse下windows提交job到linux的补丁,查阅[MAPREDUCE-5655]

Xml代码  收藏代码
  1. # 配置  
  2.   <property>  
  3.       <name>mapred.remote.os</name>  
  4.       <value>Linux</value>  
  5.   </property>  
  6.   <property>  
  7.       <name>mapreduce.job.jar</name>  
  8.       <value>dta-analyser-all.jar</value>  
  9.   </property>  
  10.   
  11.   <property>  
  12.       <name>mapreduce.map.java.opts</name>  
  13.       <value>-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=18090</value>  
  14.   </property>  
  15.   
  16.   <property>  
  17.       <name>mapred.task.timeout</name>  
  18.       <value>1800000</value>  
  19.   </property>  

............. 

Java代码  收藏代码
  1. # 代码,map/reduce数都设置为1   
  2. job.setNumReduceTasks(1);  
  3. job.getConfiguration().setInt(MRJobConfig.NUM_MAPS, 1);  

调试的时刻把超时时间设置的久一点,否则:

Java代码  收藏代码
  1. Got exception: java.net.SocketTimeoutException: Call From winseliu/127.0.0.1 to winse.com:2850 failed on socket timeout exception: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read. ch :  

调试main方法参数设置

调试main(转瞬即逝的把suspend设置为true!),map的调试选项的语句写在配置文件里面

Java代码  收藏代码
  1. export HADOOP_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8073"  
  2.   
  3. Administrator@winseliu ~/hadoop  
  4. $ sh -x bin/hadoop org.apache.hadoop.examples.WordCount /in /out   

遍历所有子节点,查找节点运行map程序的信息

 

map调试的端口配置为18090,根据这个选项来查找程序运行的机器。

Java代码  收藏代码
  1. [hadoop@umcc97-44 ~]$ for h in `cat hadoop-2.2.0/etc/hadoop/slaves` ; do ssh $h 'ps aux|grep java | grep 18090'; echo $h;  done  
  2. hadoop    8667  0.0  0.0  63888  1268 ?        Ss   18:21   0:00 bash -c ps aux|grep java | grep 18090  
  3. umcc97-142  
  4. hadoop   12686  0.0  0.0  63868  1260 ?        Ss   18:21   0:00 bash -c ps aux|grep java | grep 18090  
  5. umcc97-143  
  6. hadoop   23516  0.0  0.0  63856  1108 ?        Ss   18:11   0:00 /bin/bash -c /home/java/jdk1.7.0_45/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN  -Xmx256m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=18090 -Djava.io.tmpdir=/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1397006359464_1605/container_1397006359464_1605_01_000002/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1605/container_1397006359464_1605_01_000002 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 10.18.97.143 57576 attempt_1397006359464_1605_m_000000_0 2 1>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1605/container_1397006359464_1605_01_000002/stdout 2>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1605/container_1397006359464_1605_01_000002/stderr   
  7. hadoop   23522  0.0  0.0 605136 15728 ?        Sl   18:11   0:00 /home/java/jdk1.7.0_45/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx256m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=18090 -Djava.io.tmpdir=/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1397006359464_1605/container_1397006359464_1605_01_000002/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1605/container_1397006359464_1605_01_000002 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 10.18.97.143 57576 attempt_1397006359464_1605_m_000000_0 2  
  8. hadoop   23665  0.0  0.0  63856  1264 ?        Ss   18:21   0:00 bash -c ps aux|grep java | grep 18090  
  9. umcc97-144  

仅打印运行map的节点名称

Java代码  收藏代码
  1. [hadoop@umcc97-44 ~]$ for h in `cat hadoop-2.2.0/etc/hadoop/slaves` ; do ssh $h 'if ps aux|grep -v grep | grep java | grep 18090 | grep -v bash 2>&1 1>/dev/null ; then echo `hostname`; fi'; done  
  2. umcc97-142  
  3. [hadoop@umcc97-44 ~]$   

后面的操作就和普通的java程序调试步骤一样了。不再赘述。

 

任务运行过程中的数据

 

辅助运行的两个bash程序

 

运行的第一个程序(000001)为AppMaster,第二程序(000002)才是我们提交job的map任务。

Java代码  收藏代码
  1. [hadoop@umcc97-143 ~]$ cd hadoop-2.2.0/tmp/nm-local-dir/nmPrivate  
  2. [hadoop@umcc97-143 nmPrivate]$ ls -Rl  
  3. .:  
  4. total 12  
  5. drwxrwxr-x 4 hadoop hadoop 4096 Apr 21 18:34 application_1397006359464_1606  
  6. -rw-rw-r-- 1 hadoop hadoop    6 Apr 21 18:34 container_1397006359464_1606_01_000001.pid  
  7. -rw-rw-r-- 1 hadoop hadoop    6 Apr 21 18:34 container_1397006359464_1606_01_000002.pid  
  8.   
  9. ./application_1397006359464_1606:  
  10. total 8  
  11. drwxrwxr-x 2 hadoop hadoop 4096 Apr 21 18:34 container_1397006359464_1606_01_000001  
  12. drwxrwxr-x 2 hadoop hadoop 4096 Apr 21 18:34 container_1397006359464_1606_01_000002  
  13.   
  14. ./application_1397006359464_1606/container_1397006359464_1606_01_000001:  
  15. total 8  
  16. -rw-r--r-- 1 hadoop hadoop   95 Apr 21 18:34 container_1397006359464_1606_01_000001.tokens  
  17. -rw-r--r-- 1 hadoop hadoop 3121 Apr 21 18:34 launch_container.sh  
  18.   
  19. ./application_1397006359464_1606/container_1397006359464_1606_01_000002:  
  20. total 8  
  21. -rw-r--r-- 1 hadoop hadoop  129 Apr 21 18:34 container_1397006359464_1606_01_000002.tokens  
  22. -rw-r--r-- 1 hadoop hadoop 3532 Apr 21 18:34 launch_container.sh  
  23. [hadoop@umcc97-143 nmPrivate]$   
  24. [hadoop@umcc97-143 nmPrivate]$ jps  
  25. 4692 NodeManager  
  26. 4173 DataNode  
  27. 13497 YarnChild  
  28. 7538 HRegionServer  
  29. 13376 MRAppMaster  
  30. 13574 Jps  
  31. [hadoop@umcc97-143 nmPrivate]$ cat *.pid  
  32. 13366  
  33. 13491  
  34. [hadoop@umcc97-143 nmPrivate]$ ps aux | grep 13366  
  35. hadoop   13366  0.0  0.0  63868  1088 ?        Ss   18:34   0:00 /bin/bash -c /home/java/jdk1.7.0_45/bin/java -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000001 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA  -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000001/stdout 2>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000001/stderr   
  36. hadoop   13594  0.0  0.0  61204   760 pts/2    S+   18:36   0:00 grep 13366  
  37. [hadoop@umcc97-143 nmPrivate]$ ps aux | grep 13491  
  38. hadoop   13491  0.0  0.0  63868  1100 ?        Ss   18:34   0:00 /bin/bash -c /home/java/jdk1.7.0_45/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN  -Xmx256m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=18090 -Djava.io.tmpdir=/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1397006359464_1606/container_1397006359464_1606_01_000002/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000002 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 10.18.97.143 52046 attempt_1397006359464_1606_m_000000_0 2 1>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000002/stdout 2>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000002/stderr   
  39. hadoop   13599  0.0  0.0  61204   760 pts/2    S+   18:37   0:00 grep 13491  
  40. [hadoop@umcc97-143 nmPrivate]$  

程序运行本地缓存数据

Java代码  收藏代码
  1. [hadoop@umcc97-143 container_1397006359464_1606_01_000002]$ ls -l  
  2. total 28  
  3. -rw-r--r-- 1 hadoop hadoop  129 Apr 21 18:34 container_tokens  
  4. -rwx------ 1 hadoop hadoop  516 Apr 21 18:34 default_container_executor.sh  
  5. lrwxrwxrwx 1 hadoop hadoop   65 Apr 21 18:34 filter.io -> /home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/filecache/10/filter.io  
  6. lrwxrwxrwx 1 hadoop hadoop  120 Apr 21 18:34 job.jar -> /home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1397006359464_1606/filecache/10/job.jar  
  7. lrwxrwxrwx 1 hadoop hadoop  120 Apr 21 18:34 job.xml -> /home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1397006359464_1606/filecache/13/job.xml  
  8. -rwx------ 1 hadoop hadoop 3532 Apr 21 18:34 launch_container.sh  
  9. drwx--x--- 2 hadoop hadoop 4096 Apr 21 18:34 tmp  
  10. [hadoop@umcc97-143 container_1397006359464_1606_01_000002]$  

处理问题方法

 

打印DEBUG日志:export HADOOP_ROOT_LOGGER=DEBUG,console

日志文件放置在nodemanager节点的logs/userlogs目录下。

打印DEBUG日志也搞不定时,可以在源码里面sysout信息然后把class覆盖,来进行定位配置的问题。

如果不清楚shell的执行过程,可以通过sh -x [CMD],或者在脚本文件的操作前加上set -x。相当于windows-batch的echo on功能。


0 0
原创粉丝点击