【发布时间】:2012-04-12 12:50:29
【问题描述】:
我在单机、仅限本地的设置中运行 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
我这样做了,我可以在 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 在做什么?我必须在我的
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);
}
}
【问题讨论】:
-
顺便说一句,如果你只是想调试你的映射器/减速器逻辑,你应该考虑使用 MRUnit (cloudera.com/blog/2009/07/…)
-
@Chris White 建议从 MRUnit 开始测试 Map/Reduce 逻辑是个好主意:incubator.apache.org/projects/mrunit.html
标签: java eclipse debugging hadoop remote-debugging