2013-07-09 42 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

相關問題