如何调试 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

  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 在做什么?我不得不在我的参考中,以使我的项目工作。eclipse 是将作业提交到我安装的 hadoop 实例,还是以某种方式从我的 maven 缓存中运行所有作业?hadoop-corepom.xmlhadoop-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);
      }
}

答案 1

在 () 脚本中进行更改。检查已触发的命令。如果命令为 ,则仅添加远程调试配置。/bin/hadoophadoop-env.shjar

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

答案 2

在 eclipse 中调试 hadoop 的唯一方法是在本地模式下运行 hadoop。原因是,每个map reduce任务都在自己的JVM中运行,当您在本地模式下没有hadoop时,eclipse将无法调试。

当您将 hadoop 设置为本地模式时,hadoop 文件系统将更改为 ,而不是使用 hdfs API(这是默认设置)。因此,运行将不是 hdfs 命令,而是更多的 ,是本地目录的路径。没有一个 JobTracker 或 NameNode 运行。file:///hadoop fs -lshadoop fs -ls file:///

这些博客文章可能会有所帮助: