如何调试 hadoop mapreduce 作业?
我正在一个单机的、仅限本地的设置中运行hadoop,我正在寻找一种很好、无痛的方式来调试 eclipse 中的映射器和化简器。Eclipse 在运行 mapreduce 任务时没有问题。但是,当我进行调试时,它会给我这个错误:
12/03/28 14:03:23 WARN MAPRED.作业客户端:未设置作业 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 在做什么?我不得不在我的参考中,以使我的项目工作。eclipse 是将作业提交到我安装的 hadoop 实例,还是以某种方式从我的 maven 缓存中运行所有作业?
hadoop-core
pom.xml
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);
}
}