您需要一種機制,使用戶代碼(映射器,組合器,縮減器類等)可以提供給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