我正在单机,仅本地设置中运行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并重新启动机器。大痛。所以我有几个问题:
  • 有没有更简单的方法可以在Eclipse中调试mapreduce作业?
  • 为什么eclipse可以很好地运行mapreduce作业,但是要进行调试,我需要使用远程调试?
  • 是否有一种方法可以告诉hadoop对mapreduce作业使用远程调试,而对其他所有任务都以正常模式运行? (例如“hadoop队列”或“hbase shell”)。
  • 是否有更简单的方法来切换hadoop-env.sh配置而无需重新启动计算机? hadoop-env.sh默认情况下不可执行。
  • 这是一个更普遍的问题:当我在仅本地模式下运行hadoop时,到底发生了什么?我的计算机上是否有“始终处于运行状态”并正在执行hadoop作业的进程?还是hadoop仅在我从命令行运行“hadoop”命令时才做事?当我从Eclipse运行mapreduce作业时,eclipse在做什么?为了使我的项目正常工作,我必须在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
    

    10-07 16:41
    查看更多