san*_*oid 15 java eclipse debugging hadoop remote-debugging
我在单机,仅限本地的设置中运行hadoop,我正在寻找一种在eclipse中调试映射器和减速器的一种不错的,无痛的方法. Eclipse运行mapreduce任务没有问题.但是,当我去调试时,它给了我这个错误:
12/03/28 14:03:23 WARN mapred.JobClient:没有工作jar文件集.可能找不到用户类.请参阅JobConf(Class)或JobConf#setJar(String).
好的,我做了一些研究.显然,我应该使用eclipse的远程调试工具,并将其添加到我的hadoop-env.sh:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000
Run Code Online (Sandbox Code Playgroud)
我这样做,我可以在eclipse中逐步完成我的代码.唯一的问题是,由于"suspend = y",我无法使用命令行中的"hadoop"命令来执行查看作业队列等操作; 它挂起,我想象,因为它正在等待调试器附加.此外,当我处于这种模式时,我无法运行"hbase shell",可能是出于同样的原因.
所以基本上,如果我想在"调试模式"和"正常模式"之间来回切换,我需要更新hadoop-env.sh并重新启动我的机器.主要的痛苦.所以我有几个问题:
有没有更简单的方法在eclipse中调试mapreduce作业?
为什么eclipse可以很好地运行我的mapreduce作业,但是对于调试我需要使用远程调试?
有没有办法告诉hadoop使用远程调试mapreduce作业,但是在正常模式下操作所有其他任务?(例如"hadoop queue"或"hbase shell").
是否有更简单的方法来切换hadoop-env.sh配置而无需重新启动我的机器?hadoop-env.sh默认情况下不可执行.
这是一个更普遍的问题:当我在仅本地模式下运行hadoop时究竟发生了什么?我的机器上是否有任何"始终打开"并执行hadoop作业的进程?或者,当我从命令行运行"hadoop"命令时,hadoop只执行操作吗?当我从eclipse运行mapreduce工作时,eclipse正在做什么?我必须hadoop-core在我的引用pom.xml中使我的项目工作.eclipse是否将作业提交到我已安装的hadoop实例,还是以某种方式从hadoop-core-1.0.0.jar我的maven缓存中运行它?
这是我的主要课程:
public class Main {
public static void main(String[] args) throws Exception {
Job job = new Job();
job.setJarByClass(Main.class);
job.setJobName("FirstStage");
FileInputFormat.addInputPath(job, new Path("/home/sangfroid/project/in"));
FileOutputFormat.setOutputPath(job, new Path("/home/sangfroid/project/out"));
job.setMapperClass(FirstStageMapper.class);
job.setReducerClass(FirstStageReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
在/bin/hadoop(hadoop-env.sh)脚本中进行更改.检查已触发的命令.如果命令是jar,则只添加远程调试配置.
if [ "$COMMAND" = "jar" ] ; then
exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
else
exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
fi
Run Code Online (Sandbox Code Playgroud)
在eclipse中调试hadoop的唯一方法是在本地模式下运行hadoop.原因是,每个map reduce任务在ist自己的JVM中运行,当你没有在本地模式下运行时,eclipse将无法调试.
当您将hadoop设置为本地模式时,而不是使用hdfs API(这是默认值),hadoop文件系统更改为file:///.因此,运行hadoop fs -ls不是hdfs命令,而是更多的hadoop fs -ls file:///本地目录路径.JobTracker或NameNode都不会运行.
这些博文可能会有所帮助:
小智 1
除了推荐的 MRUnit 之外,我还喜欢使用 eclipse 进行调试。我有一个主程序。它实例化一个Configuration并直接执行MapReduce作业。我只是使用标准 eclipse 调试配置进行调试。由于我在 mvn 规范中包含了 hadoop jar,因此我的类路径中包含了所有 hadoop 本身,并且不需要针对我安装的 hadoop 运行它。我总是使用本地目录中的小数据集进行测试,以使事情变得简单。配置的默认值表现为独立的 hadoop(文件系统可用)
| 归档时间: |
|
| 查看次数: |
23256 次 |
| 最近记录: |