2013-07-09 32 views
1

我目前使用maven进行依赖关系管理。如何通过jobClient自动将jar提交给hadoop

在这种情况下,我写了一个方法将一个map-reduce作业提交给hadoop,然后为这个方法写了一个junit测试。

当我运行mvn package它编译成功(所有依赖关系是正确的)它是单元测试失败。

就业跟踪我可以看到一个ClassNotFoundException表示我的地图,结合&减少类节点上找不到。

我不想用conf.setJar手动设置此jar文件的路径。

有没有办法做到这一点自动工作?

回答

1

您需要一种机制,使用户代码(映射器,组合器,缩减器类等)可以提供给TaskTracker。这通常是通过将您的类捆绑到jar文件中,然后使用方法来处理的。在幕后,hadoop会将这个jar上传到HDFS中的tmp作业目录,并将tmp HDFS作业jar添加到分布式缓存中。

我的建议是将你的单元测试集成到集成测试中 - maven生命周期中的这个阶段发生在包之后,并且你将拥有一个jar,然后你可以调用setJar并知道你会创建一个jar (我猜在这里你不会在普通的测试阶段调用setJar,因为jar还没有被构建)。

最后,如果你想测试你的mapper/reducer代码而不运行在真正的集群中,你应该看看MRUnit或以hadoop本地模式运行作业 - 两者都不需要你建立一个jar。

以供参考,在这里是在本地模式下运行的最小的JUnit片段,我的Ubuntu桌面上工作(您将需要cygwin的或unxutils安装,如果你的桌面窗口)。这不是一个单元测试,因为它没有声明输出:

@Test 
public void testLocalRun() throws IOException, InterruptedException, ClassNotFoundException { 
    Job job = new Job(); 
    job.setInputFormatClass(TextInputFormat.class); 
    FileInputFormat.setInputPaths(job, 
      "src/test/java/csw/hadoop/sandbox/LocalHadoopTest.java"); 
    job.setOutputFormatClass(TextOutputFormat.class); 
    TextOutputFormat.setOutputPath(job, new Path(
      "target/hadoop-local-output")); 

    job.setNumReduceTasks(0); 

    job.waitForCompletion(true); 
} 
+0

谢谢。当我将这些测试标记为集成测试时,它适用于我 – tess3ract

相关问题