http://qq85609655.iteye.com/blog/2193931
了解程序运行过程,除了一行行代码的扫射源代码。更快捷的方式是运行调试源码,通过F6/F7来一步步的带领我们熟悉程序。针对特定细节具体数据,打个断点调试则是水到渠成的方式。
Java远程调试
-
*JDK1.3orearlier-Xnoagent-Djava.compiler=NONE-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006
-
*JDK1.4(linuxok)-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006
-
*newerJDK(win7&jdk7)-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006
同一操作系统任务提交
windows提交到windows,linux提交到linux,可以直接通过命令行添加参数调试wordcount任务:
-
E:\local\dotfile>hdfsdfs-rmr/out#native-lib放在非path路径下,cmd脚本中有对其进行处理
-
-
E:\local\dotfile>hadooporg.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]
-
#配置
-
<property>
-
<name>mapred.remote.os</name>
-
<value>Linux</value>
-
</property>
-
<property>
-
<name>mapreduce.job.jar</name>
-
<value>dta-analyser-all.jar</value>
-
</property>
-
-
<property>
-
<name>mapreduce.map.java.opts</name>
-
<value>-Xmx1024m-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=18090</value>
-
</property>
-
-
<property>
-
<name>mapred.task.timeout</name>
-
<value>1800000</value>
-
</property>
.............
-
#代码,map/reduce数都设置为1
-
job.setNumReduceTasks(1);
-
job.getConfiguration().setInt(MRJobConfig.NUM_MAPS,1);
调试的时刻把超时时间设置的久一点,否则:
-
Gotexception:java.net.SocketTimeoutException:CallFromwinseliu/127.0.0.1towinse.com:2850failedonsockettimeoutexception:java.net.SocketTimeoutException:60000millistimeoutwhilewaitingforchanneltobereadyforread.ch:
调试main方法参数设置
调试main(转瞬即逝的把suspend设置为true!),map的调试选项的语句写在配置文件里面
-
exportHADOOP_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8073"
-
-
Administrator@winseliu~/hadoop
-
$sh-xbin/hadooporg.apache.hadoop.examples.WordCount/in/out
遍历所有子节点,查找节点运行map程序的信息
map调试的端口配置为18090,根据这个选项来查找程序运行的机器。
-
[hadoop@umcc97-44~]$forhin`cathadoop-2.2.0/etc/hadoop/slaves`;dossh$h'psaux|grepjava|grep18090';echo$h;done
-
hadoop86670.00.0638881268?Ss18:210:00bash-cpsaux|grepjava|grep18090
-
umcc97-142
-
hadoop126860.00.0638681260?Ss18:210:00bash-cpsaux|grepjava|grep18090
-
umcc97-143
-
hadoop235160.00.0638561108?Ss18:110: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,CLAorg.apache.hadoop.mapred.YarnChild10.18.97.14357576attempt_1397006359464_1605_m_000000_021>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1605/container_1397006359464_1605_01_000002/stdout2>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1605/container_1397006359464_1605_01_000002/stderr
-
hadoop235220.00.060513615728?Sl18:110: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,CLAorg.apache.hadoop.mapred.YarnChild10.18.97.14357576attempt_1397006359464_1605_m_000000_02
-
hadoop236650.00.0638561264?Ss18:210:00bash-cpsaux|grepjava|grep18090
-
umcc97-144
仅打印运行map的节点名称
-
[hadoop@umcc97-44~]$forhin`cathadoop-2.2.0/etc/hadoop/slaves`;dossh$h'ifpsaux|grep-vgrep|grepjava|grep18090|grep-vbash2>&11>/dev/null;thenecho`hostname`;fi';done
-
umcc97-142
-
[hadoop@umcc97-44~]$
后面的操作就和普通的java程序调试步骤一样了。不再赘述。
任务运行过程中的数据
辅助运行的两个bash程序
运行的第一个程序(000001)为AppMaster,第二程序(000002)才是我们提交job的map任务。
-
[hadoop@umcc97-143~]$cdhadoop-2.2.0/tmp/nm-local-dir/nmPrivate
-
[hadoop@umcc97-143nmPrivate]$ls-Rl
-
.:
-
total12
-
drwxrwxr-x4hadoophadoop4096Apr2118:34application_1397006359464_1606
-
-rw-rw-r--1hadoophadoop6Apr2118:34container_1397006359464_1606_01_000001.pid
-
-rw-rw-r--1hadoophadoop6Apr2118:34container_1397006359464_1606_01_000002.pid
-
-
./application_1397006359464_1606:
-
total8
-
drwxrwxr-x2hadoophadoop4096Apr2118:34container_1397006359464_1606_01_000001
-
drwxrwxr-x2hadoophadoop4096Apr2118:34container_1397006359464_1606_01_000002
-
-
./application_1397006359464_1606/container_1397006359464_1606_01_000001:
-
total8
-
-rw-r--r--1hadoophadoop95Apr2118:34container_1397006359464_1606_01_000001.tokens
-
-rw-r--r--1hadoophadoop3121Apr2118:34launch_container.sh
-
-
./application_1397006359464_1606/container_1397006359464_1606_01_000002:
-
total8
-
-rw-r--r--1hadoophadoop129Apr2118:34container_1397006359464_1606_01_000002.tokens
-
-rw-r--r--1hadoophadoop3532Apr2118:34launch_container.sh
-
[hadoop@umcc97-143nmPrivate]$
-
[hadoop@umcc97-143nmPrivate]$jps
-
4692NodeManager
-
4173DataNode
-
13497YarnChild
-
7538HRegionServer
-
13376MRAppMaster
-
13574Jps
-
[hadoop@umcc97-143nmPrivate]$cat*.pid
-
13366
-
13491
-
[hadoop@umcc97-143nmPrivate]$psaux|grep13366
-
hadoop133660.00.0638681088?Ss18:340: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-Xmx1024morg.apache.hadoop.mapreduce.v2.app.MRAppMaster1>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000001/stdout2>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000001/stderr
-
hadoop135940.00.061204760pts/2S+18:360:00grep13366
-
[hadoop@umcc97-143nmPrivate]$psaux|grep13491
-
hadoop134910.00.0638681100?Ss18:340: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,CLAorg.apache.hadoop.mapred.YarnChild10.18.97.14352046attempt_1397006359464_1606_m_000000_021>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000002/stdout2>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1397006359464_1606/container_1397006359464_1606_01_000002/stderr
-
hadoop135990.00.061204760pts/2S+18:370:00grep13491
-
[hadoop@umcc97-143nmPrivate]$
程序运行本地缓存数据
-
[hadoop@umcc97-143container_1397006359464_1606_01_000002]$ls-l
-
total28
-
-rw-r--r--1hadoophadoop129Apr2118:34container_tokens
-
-rwx------1hadoophadoop516Apr2118:34default_container_executor.sh
-
lrwxrwxrwx1hadoophadoop65Apr2118:34filter.io->/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/filecache/10/filter.io
-
lrwxrwxrwx1hadoophadoop120Apr2118:34job.jar->/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1397006359464_1606/filecache/10/job.jar
-
lrwxrwxrwx1hadoophadoop120Apr2118:34job.xml->/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1397006359464_1606/filecache/13/job.xml
-
-rwx------1hadoophadoop3532Apr2118:34launch_container.sh
-
drwx--x---2hadoophadoop4096Apr2118:34tmp
-
[hadoop@umcc97-143container_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功能。
分享到:
相关推荐
在产品的测试阶段,开发人员应该经常会遇到一些很烦恼的问题,在开发环境不能重现问题,而在测试环境就可以重现问题。...更重要的一点是可以远程调试后台代码。下面来描述下怎么适配eclipse远程调试环境。
实用技巧:Gdbserver远程调试的具体实现实用技巧:Gdbserver远程调试的具体实现
远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿...
使用Eclipse远程调试Linux服务器Tomcat项目的一些简单的调试技巧,
自己写的介绍java远程调试的ppt。有jvm的调试模型,eclipse的调试技巧,远程调试介绍,环境搭建。并有一个demo演示截图。
一:背景 1. 讲故事 每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇: 我去,本地环境代码跑的哧溜...不错,可以上远程调试,然后
Eclipse 调试器; Debug 视图;调试 Java 语言程序;远程调试;Eclipse快捷键调试
文件中是远程调试用到的文件,调试方法如下: 1. 拷贝《vs2003远程调试文件》文件夹到目标机器任意位置 2. 运行StartMsvcmon.bat批处理 3. 保证需要调试的进程已经启动,同时在执行文件下有相应的pdb文件 4. 本地VS...
详细介绍Eclipse调试技巧:该调试器提供所有标准调试功能,包括进行单步执行、设置断点和值、检查变量和值以及暂挂和恢复线程的能力。这篇文章主要讲述Eclipse调试器,包括Debug视图,断点的设置。
主要给大家介绍了关于C#客户端程序Visual Studio远程调试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
gdb调试器源代码编译 调试的基本原理 远程调试 再谈”借壳” 一些调试技巧 调试前景展望
1、 条件断点 2、 变量断点 3、 方法断点 4、 改变变量值 5、 重新调试 6、 远程调试 7、 异常断点
书中深入地分析了开发不包地辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行代码的过程和方法,说明了关于定位、分析及修复编程错误的方法,介绍了开发Visual C++程序时所遇到的特殊调试问题...
IE开发者工具 Firefox开发者工具 Chrome开发者工具(功能最强大) 课程目标 了解使用调试工具的好处 了解谷歌浏览器js调试工具的用法。 了解谷歌浏览器js调试工具的优势。...了解如何进行java远程调试
这里简单的写一下怎么使用和调试技巧,就算是作个使用总结吧,供快速使用和问题解决!dubbo是基于spring做配置使用的,虽也提供其他方法,但是比较麻烦,所以使用spring还是有好处的吧。先来一个整体架构图,这对于...
3. Groov View: 用于Groov远程监控 (免费) 考虑到Google商店在国内无法访问,本次试用的软件为aPAC软件,只能安装在安卓系统内。 所安装软件仅供测试学习试用,如果进行商用,或在国际上使用,请直接在Google...
idea远程debug程序,目的在于方便调试别人的程序,为找出问题提供方便,不用在查看日志信息,方便快捷
详细阐述了Visual Studio平台各项使用方法和技巧,介绍了一些鲜为人知的使用方法,远程调试等.适用入门初学者. ^_^
6.2.2 循环调试技巧 6.2.3 调用调试函数 6.2.4 递归调用与调用堆栈 6.2.5 查看反汇编代码 6.3 进一步观察变量 6.3.l 使用QuickWatch窗口 6.3.2 使用Watch窗口 6.4 小结 第7章 调试内联汇编语言代码 7...