如何从eclipse调试hadoop mapreduce作业?

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并重新启动我的机器.主要的痛苦.所以我有几个问题:

  1. 有没有更简单的方法在eclipse中调试mapreduce作业?

  2. 为什么eclipse可以很好地运行我的mapreduce作业,但是对于调试我需要使用远程调试?

  3. 有没有办法告诉hadoop使用远程调试mapreduce作业,但是在正常模式下操作所有其他任务?(例如"hadoop queue""hbase shell").

  4. 是否有更简单的方法来切换hadoop-env.sh配置而无需重新启动我的机器?hadoop-env.sh默认情况下不可执行.

  5. 这是一个更普遍的问题:当我在仅本地模式下运行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)

  • 您可以将调试选项添加到shell的$ HADOOP_OPTS var中,而不必修改hadoop脚本.export HADOOP_OPTS ="$ HADOOP_OPTS -Xdebug -Xrunjdwp:transport = dt_socket,server = y,address = 8999" (4认同)

Kap*_*l D 5

在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(文件系统可用)