2012-03-28 70 views
14

我在一台单机本地设置中运行hadoop,我正在寻找一种很好的,无痛的方式来调试eclipse中的mappers和reducer。 Eclipse运行mapreduce任务没有问题。然而,当我去调试,它给了我这个错误:如何从Eclipse中调试hadoop mapreduce作业?

28年12月3日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 

我这样做,我可以通过我的代码在Eclipse的一步。唯一的问题是,由于“suspend = y”,我不能使用命令行中的“hadoop”命令来执行诸如查看作业队列等事情;它挂起,我在想象因为它正在等待调试器附加。另外,当我处于这种模式时,我无法运行“hbase shell”,可能出于同样的原因。所以基本上,如果我想在“调试模式”和“正常模式”之间来回翻转,我需要更新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); 
     } 
} 
+3

作为除此之外,如果你只是试图调试你的mapper/reducer逻辑,你应该考虑使用MRUnit(http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/) – 2012-03-28 23:40:43

+0

由于@Chris White建议从MRUnit开始测试Map/Reduce逻辑是一个好主意:http://incubator.apache.org/projects/mrunit.html – 2012-03-29 00:42:16

回答

1

除了推荐MRUnit我喜欢Eclipse来调试为好。我有一个主要的程序。它实例化一个配置并直接执行MapReduce作业。我只是用标准的eclipse Debug配置进行调试。由于我在我的mvn规范中包含了hadoop jar,所以我在课堂路径中拥有所有的hadoop本身,而且我不需要将它运行在我安装的hadoop上。我总是用本地目录中的小数据集进行测试,以使事情变得简单。配置的缺省行为像一个独立的hadoop(文件系统可用)

+0

感谢您的回答。我也在我的POM中设置了hadoop-core作为依赖项。既然如此,为什么我会得到“无作业jar文件集”错误?是因为我打电话给工作吗?setJarByClass()?你可以请张贴一些示例代码? – sangfroid 2012-03-29 17:49:13

5

在eclipse中调试hadoop的唯一方法是以本地模式运行hadoop。原因在于,每个map减少任务在自己的JVM中运行,并且当您不以本地方式运行hadoop时,eclipse将无法调试。

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

这些相关博客文章可能有帮助:

+0

嗨@Kapil,你所描述的是在Hadoop 2.4(包括Yarn等)中可能的。我正在尝试在eclipse中使用新版本运行本地作业,并面临'无法初始化群集。请检查您的配置...# – 2014-04-18 12:21:41

+0

@PedroDusso您是否已经通过本地调试来使用Hadoop 2.4+? – erichfw 2015-01-12 23:29:14

+0

@erichfw我从来没有尝试过...我在问这个问题的时候使用了2.2。 – 2015-01-13 18:01:20

0

我也喜欢通过单元测试瓦特/ MRUnit调试。我将与验证测试结合使用,创建Map Reduce过程的简单可视化,并且可以轻松传递失败的场景。它也可以从eclipse无缝运行。

例如:

HadoopApprovals.verifyMapReduce(new WordCountMapper(), 
         new WordCountReducer(), 0, "cat cat dog"); 

时会产生输出:

[cat cat dog] 
-> maps via WordCountMapper to -> 
(cat, 1) 
(cat, 1) 
(dog, 1) 

-> reduces via WordCountReducer to -> 
(cat, 2) 
(dog, 1) 

有在这里的过程视频:http://t.co/leExFVrf

6

请在/bin/hadoophadoop-env.sh)脚本的变化。检查看看哪个命令已被触发。如果命令是jar,那么只能添加远程调试配置。

if [ "$COMMAND" = "jar" ] ; then 
    exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "[email protected]" 
else 
    exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "[email protected]" 
fi 
+0

我没有尝试完全这一点,但我用jdb替换了$ JAVA(我试图使用jdb进行调试)。 jdb从来没有意识到我试图放置的地方,我希望程序停止。 我假设问题是我没有在本地模式下运行。我还没有尝试过,但我假设Kapil D的建议是我需要遵循的。 – 2013-04-15 21:15:12

+4

您可以将调试选项添加到您的shell的$ HADOOP_OPTS var中,而不必修改hadoop脚本。 export HADOOP_OPTS =“$ HADOOP_OPTS -Xdebug -Xrunjdwp:transport = dt_socket,server = y,address = 8999” – 2013-05-02 18:33:44

2

Jumbune的调试器将以最小的努力完成所有这些工作。

调试器提供MapReduce作业的代码级控制流统计信息。

用户可以应用正则表达式验证或其自己的用户定义的验证类。根据应用的验证,Flow Debugger分别检查mapper和reducer的数据流。

它还提供了一个综合的表格/图表视图,其中输入记录的流程以作业级别,MR级别和实例级别显示。 不匹配的键/值表示作业执行结果中的错误键/值数据的数量。调试器向下展开到代码以检查各种计数器样环,并且如果条件的数据流,否则,如果等

Jumbune是开源和可用在www.jumbune.org和https://github.com/impetus-opensource/jumbune