您需要一种机制,使用户代码(映射器,组合器,缩减器类等)可以提供给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);
}
谢谢。当我将这些测试标记为集成测试时,它适用于我 – tess3ract