了解程序运行过程,除了一行行代码的扫射源代码。更快捷的方式是运行调试源码,通过F6/F7来一步步的带领我们熟悉程序。针对特定细节具体数据,打个断点调试则是水到渠成的方式。
Java远程调试
* JDK 1.3 or earlier -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006 * JDK 1.4(linux ok) -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006 * newer JDK(win7 & jdk7) -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006
同一操作系统任务提交
windows提交到windows,linux提交到linux,可以直接通过命令行添加参数调试wordcount任务:
E:\local\dotfile>hdfs dfs -rmr /out # native-lib放在非path路径下,cmd脚本中有对其进行处理 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]
# 配置 <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);
调试的时刻把超时时间设置的久一点,否则:
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的调试选项的语句写在配置文件里面
export HADOOP_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8073" Administrator@winseliu ~/hadoop $ sh -x bin/hadoop org.apache.hadoop.examples.WordCount /in /out
遍历所有子节点,查找节点运行map程序的信息
map调试的端口配置为18090,根据这个选项来查找程序运行的机器。
[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 hadoop 8667 0.0 0.0 63888 1268 ? Ss 18:21 0:00 bash -c ps aux|grep java | grep 18090 umcc97-142 hadoop 12686 0.0 0.0 63868 1260 ? Ss 18:21 0:00 bash -c ps aux|grep java | grep 18090 umcc97-143 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 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 hadoop 23665 0.0 0.0 63856 1264 ? Ss 18:21 0:00 bash -c ps aux|grep java | grep 18090 umcc97-144
仅打印运行map的节点名称
[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 umcc97-142 [hadoop@umcc97-44 ~]$
后面的操作就和普通的java程序调试步骤一样了。不再赘述。
任务运行过程中的数据
辅助运行的两个bash程序
运行的第一个程序(000001)为AppMaster,第二程序(000002)才是我们提交job的map任务。
[hadoop@umcc97-143 ~]$ cd hadoop-2.2.0/tmp/nm-local-dir/nmPrivate [hadoop@umcc97-143 nmPrivate]$ ls -Rl .: total 12 drwxrwxr-x 4 hadoop hadoop 4096 Apr 21 18:34 application_1397006359464_1606 -rw-rw-r-- 1 hadoop hadoop 6 Apr 21 18:34 container_1397006359464_1606_01_000001.pid -rw-rw-r-- 1 hadoop hadoop 6 Apr 21 18:34 container_1397006359464_1606_01_000002.pid ./application_1397006359464_1606: total 8 drwxrwxr-x 2 hadoop hadoop 4096 Apr 21 18:34 container_1397006359464_1606_01_000001 drwxrwxr-x 2 hadoop hadoop 4096 Apr 21 18:34 container_1397006359464_1606_01_000002 ./application_1397006359464_1606/container_1397006359464_1606_01_000001: total 8 -rw-r--r-- 1 hadoop hadoop 95 Apr 21 18:34 container_1397006359464_1606_01_000001.tokens -rw-r--r-- 1 hadoop hadoop 3121 Apr 21 18:34 launch_container.sh ./application_1397006359464_1606/container_1397006359464_1606_01_000002: total 8 -rw-r--r-- 1 hadoop hadoop 129 Apr 21 18:34 container_1397006359464_1606_01_000002.tokens -rw-r--r-- 1 hadoop hadoop 3532 Apr 21 18:34 launch_container.sh [hadoop@umcc97-143 nmPrivate]$ [hadoop@umcc97-143 nmPrivate]$ jps 4692 NodeManager 4173 DataNode 13497 YarnChild 7538 HRegionServer 13376 MRAppMaster 13574 Jps [hadoop@umcc97-143 nmPrivate]$ cat *.pid 13366 13491 [hadoop@umcc97-143 nmPrivate]$ ps aux | grep 13366 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 hadoop 13594 0.0 0.0 61204 760 pts/2 S+ 18:36 0:00 grep 13366 [hadoop@umcc97-143 nmPrivate]$ ps aux | grep 13491 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 hadoop 13599 0.0 0.0 61204 760 pts/2 S+ 18:37 0:00 grep 13491 [hadoop@umcc97-143 nmPrivate]$
程序运行本地缓存数据
[hadoop@umcc97-143 container_1397006359464_1606_01_000002]$ ls -l total 28 -rw-r--r-- 1 hadoop hadoop 129 Apr 21 18:34 container_tokens -rwx------ 1 hadoop hadoop 516 Apr 21 18:34 default_container_executor.sh 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 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 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 -rwx------ 1 hadoop hadoop 3532 Apr 21 18:34 launch_container.sh drwx--x--- 2 hadoop hadoop 4096 Apr 21 18:34 tmp [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功能。
相关推荐
总结,要在Windows 7上的Eclipse环境中调试Hadoop 2.x,你需要正确配置Java环境,安装Eclipse并设置Hadoop的开发环境,创建远程调试配置,以及处理Windows特有的`hadoop.dll`和`winutils.exe`文件。这个过程需要对...
总之,调试Hadoop源码在Windows下的IDEA环境中是一项技术性的任务,需要对Java开发、Hadoop框架以及IDEA的高级特性有深入的理解。通过上述步骤,开发者可以在本地环境中高效地定位和解决问题,从而提升Hadoop应用的...
本篇文章将详细阐述如何利用Eclipse有效地调试Hadoop作业,以及与之相关的源码分析和工具使用技巧。 首先,调试Hadoop作业的准备工作至关重要。你需要确保已经安装并配置好Eclipse,同时在本地或远程服务器上安装了...
4. **本地运行与调试**:插件支持在本地模拟Hadoop环境运行MapReduce任务,便于测试和调试,同时也提供了远程提交到实际Hadoop集群的功能。 5. **资源管理**:开发者可以通过插件方便地管理HDFS上的文件,如上传、...
"Hadoop2x-eclipse-plugin"是专门为Eclipse设计的一款插件,它使得Eclipse能够支持Hadoop开发,包括创建MapReduce项目、调试Hadoop程序以及方便地管理Hadoop集群。此插件主要适用于Hadoop2.x版本,适应了Hadoop生态...
Hadoop提供了一组可扩展的I/O接口,如`InputFormat`和`OutputFormat`,用于定义如何将数据分割成适合MapReduce任务处理的小块,以及如何将处理后的结果写回到HDFS。开发者可以根据需求自定义这些接口来适应不同的...
Eclipse是流行的Java集成开发环境(IDE),而Hadoop-Eclipse插件是将Hadoop与Eclipse结合的工具,允许开发者在Eclipse中直接创建、运行和调试Hadoop MapReduce程序。这些文件"hadop-eclipse-plugin-2.5.2.jar"、...
描述中提到的“Windows下远程调试Hadoop”,在Hadoop集群中,开发人员可能需要通过远程调试工具对运行在集群节点上的应用程序进行调试。在Windows环境中,由于默认配置问题,可能会遇到运行时错误,如空指针异常...
【Hadoop-eclipse 插件】是专门为Java开发人员设计的一款工具,它使得在Eclipse集成开发环境中可以直接管理和调试Hadoop项目变得更为便捷。这款插件的引入,极大地简化了Hadoop应用程序的开发流程,让开发者能够充分...
4. **连接Hadoop集群**:通过设置Hadoop的配置文件(core-site.xml和hdfs-site.xml),开发者可以连接到本地或远程的Hadoop集群。 5. **提交和监控作业**:在Eclipse中直接提交MapReduce作业到Hadoop集群,并可以在...
- 配置Hadoop集群连接,允许在本地或远程集群上进行调试和运行作业。 - 直接通过Eclipse IDE浏览HDFS,上传和下载文件。 - 自动完成Hadoop相关的类库和API,提高编码效率。 - 提供错误检查和代码提示,帮助避免常见...
本文将详细讲解如何在Window 7环境下搭建Hadoop 2.6的开发环境,以及如何进行远程调试,这对于进行大规模数据处理的开发者来说至关重要。 首先,我们需要了解Hadoop的基本构成。Hadoop主要由两个核心组件组成:...
同时,它支持远程调试,可以在代码中设置断点,观察变量状态,排查问题。 4. **版本差异**: - **2.7.1**:这是Hadoop 2.7.x系列的早期版本,可能包含了基础的Hadoop-Eclipse集成功能,如基本的作业提交和调试支持...
2. **编辑器支持**:支持Hadoop相关的配置文件(如hdfs-site.xml、mapred-site.xml、core-site.xml)的编辑,提供代码自动完成和错误检查。 3. **运行/调试支持**:可以直接在Eclipse内提交MapReduce任务进行运行或...
这对于开发和优化Hadoop应用程序、调试集群问题以及理解分布式系统原理非常有价值。 9. **MapReduce工作流程**:在Hadoop 1.2.1中,MapReduce包括Map阶段和Reduce阶段,中间数据通过Shuffle和Sort进行处理。通过...
4. **运行与调试**:可以直接在Eclipse内提交MapReduce作业到Hadoop集群,进行本地或远程运行和调试。可以设置断点、查看变量状态,以及跟踪程序执行流程。 5. **资源管理**:通过插件,开发者可以查看集群状态,如...
9. **错误处理与调试**:如果作业遇到问题,Eclipse会显示错误信息,帮助开发者定位问题。同时,通过Hadoop的日志系统,可以获取到更详细的错误信息,以便进行调试。 10. **优化与性能**:在开发过程中,你可能需要...
6. **测试与部署**:编译完成后,你可以将编译好的Hadoop JAR文件部署到你的集群上,然后通过Eclipse插件进行远程调试或者本地运行测试,确保Hadoop功能正常。 7. **版本兼容性**:要注意的是,Hadoop的版本与...
然后,你可以在IDE中设置远程调试器,连接到这些端口,从而在任务运行时进行调试。 readme.txt文件通常会包含关于如何使用和配置这个软件包的重要信息。在这个场景下,它可能详细解释了如何在Windows环境下安装和...