java - 如何从 eclipse 调试 hadoop mapreduce 作业?

标签 java eclipse debugging hadoop remote-debugging

我在单机、仅限本地的设置中运行 hadoop,我正在寻找一种在 eclipse 中调试映射器和缩减器的好用、无痛的方法。 Eclipse 运行 mapreduce 任务没有问题。但是,当我去调试时,它给了我这个错误:

12/03/28 14:03:23 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).

好的,所以我会做一些研究。显然,我应该使用 eclipse 的远程调试工具,并将其添加到我的 hadoop-env.sh 中:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000

我这样做了,我可以在 Eclipse 中单步执行我的代码。唯一的问题是,由于“suspend=y”,我无法使用命令行中的“hadoop”命令来执行诸如查看作业队列之类的操作;它挂起,我想是因为它正在等待调试器附加。另外,当我处于这种模式时,我无法运行“hbase shell”,可能是出于同样的原因。

所以基本上,如果我想在“ Debug模式”和“正常模式”之间来回切换,我需要更新hadoop-env.sh 并重新启动我的机器。主要疼痛。所以我有几个问题:

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

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

  3. 有没有办法告诉 hadoop 对 mapreduce 作业使用远程调试,但对所有其他任务在正常模式下运行? (例如“hadoop 队列”“hbase shell”)。

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

  5. 这是一个更普遍的问题:当我在仅本地模式下运行 hadoop 时到底发生了什么?我的机器上是否有任何“始终在线”并执行 hadoop 作业的进程?或者 hadoop 只在我从命令行运行“hadoop”命令时才做事吗?当我从 eclipse 运行 mapreduce 作业时,eclipse 在做什么?我必须在我的 pom.xml 中引用 hadoop-core 才能使我的项目正常运行。 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

关于java - 如何从 eclipse 调试 hadoop mapreduce 作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915808/

相关文章:

java - 如何更新 TableViewer 中的 ProgressBar?

c# - VS 2012 的 LINQ to SQL 调试可视化工具?

python - 如何调试 Python 程序(我来自 Ruby on Rails/JavaScript 背景)?

javascript - 清除 Eclipse 的内部 Web 浏览器

java - 如何更改 JSlider 的默认/起始值

java - 创建类实例

java - 无法将字符串转换为 LocalDateTime 对象

java - ImagePanel 未显示在我的带有 netbeans 的 jar 文件中

android - Eclipse 和 ADT : compiling XML files, 非常烦人

php - Eclipse PDT 和自定义 PHPDoc 注释