我正在单机,仅本地设置中运行hadoop,并且我正在寻找一种不错的,无痛苦的方式来调试Eclipse中的映射器和化简器。 Eclipse运行mapreduce任务没有问题。但是,当我去调试时,它给了我这个错误:
好吧,所以我做了一些研究。显然,我应该使用eclipse的远程调试工具,并将其添加到我的hadoop-env.sh
中:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000
我这样做了,我可以逐步浏览我的代码。唯一的问题是,由于“suspend = y”,我无法使用命令行中的“hadoop”命令执行类似查看作业队列的操作;我想像它挂起了,因为它在等待调试器附加。另外,在这种模式下,我可能无法运行“hbase shell”,可能是出于相同的原因。
因此,基本上,如果我想在“ Debug模式”和“正常模式” 之间来回切换,我需要更新
hadoop-env.sh
并重新启动机器。大痛。所以我有几个问题:hadoop-env.sh
配置而无需重新启动计算机? hadoop-env.sh默认情况下不可执行。 hadoop-core
中引用pom.xml
。 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);
}
}
最佳答案
在/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