我在一台单机本地设置中运行hadoop,我正在寻找一种很好的,无痛的方式来调试eclipse中的mappers和reducer。 Eclipse运行mapreduce任务没有问题。然而,当我去调试,它给了我这个错误:如何从Eclipse中调试hadoop mapreduce作业?
28年12月3日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
我这样做,我可以通过我的代码在Eclipse的一步。唯一的问题是,由于“suspend = y”,我不能使用命令行中的“hadoop”命令来执行诸如查看作业队列等事情;它挂起,我在想象因为它正在等待调试器附加。另外,当我处于这种模式时,我无法运行“hbase shell”,可能出于同样的原因。所以基本上,如果我想在“调试模式”和“正常模式”之间来回翻转,我需要更新hadoop-env.sh
并重新启动我的机器。重大的痛苦。所以我有几个问题:
有没有一种更简单的方法来在eclipse中调试mapreduce作业?
eclipse如何运行我的mapreduce作业就好了,但对于调试我需要使用远程调试?
有没有办法告诉hadoop对mapreduce作业使用远程调试,但是对于所有其他任务以正常模式运行? (如“hadoop队列”或“hbase shell”)。
有没有更简单的方法来切换
hadoop-env.sh
配置,而无需重新启动我的机器? hadoop-env.sh默认不可执行。这是一个比较普遍的问题:当我以本地模式运行hadoop时究竟发生了什么?我的机器上是否有任何“始终在线”并正在执行Hadoop作业的进程?或者,当我从命令行运行“hadoop”命令时,hadoop只会做些什么?当我从eclipse运行mapreduce作业时,eclipse在做什么?我必须在我的
pom.xml
中参考hadoop-core
才能使我的项目工作。 eclipse是否将作业提交给我已安装的hadoop实例,还是以某种方式从我的maven缓存中的hadoop-core-1.0.0.jar
运行它?
这里是我的主类:
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);
}
}
作为除此之外,如果你只是试图调试你的mapper/reducer逻辑,你应该考虑使用MRUnit(http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/) – 2012-03-28 23:40:43
由于@Chris White建议从MRUnit开始测试Map/Reduce逻辑是一个好主意:http://incubator.apache.org/projects/mrunit.html – 2012-03-29 00:42:16