2013-07-18 135 views
0

我可以將幾個映射器類設置爲一個工作嗎?Hadoop幾個映射器

例如我有一個來自HDFS的csv輸入文件。我有兩個任務要做。第一個是從csv輸入文件中計數兩個字段並將結果輸入到輸出文件中。第二個是從同一個csv輸入文件中計算另外兩個字段,並將結果導入另一個輸出文件。減速機是一樣的。

我怎樣才能實現這一點只是使用一個工作,並使他們在同一時間? (我不想做第一個,然後在第一個完成後做第二個,我想讓他們平行過程)。

我試試下面的代碼:

job1.setMapperClass(Mapper1.class); 
    job1.setReducerClass(LogReducer.class); 

    job1.setMapperClass(Mapper2.class); 
    job1.setReducerClass(LogReducer.class); 

我嘗試,但它不能正常工作,它只是讓我第二個結果,第一個是消失。

回答

2

顯然需要兩個作業並行運行。由於映射任務和輸出路徑不同,因此並行運行兩個作業的問題是什麼。如果不鏈接,作業無法處理多個映射器。

2

所以問題是你是否想要減速器的一個輸出或兩個輸出。您可以映射兩個輸入,一個由Mapper1映射,另一個由Mapper2映射,然後將合併的中間結果傳遞給reducer以獲取一個輸出。這是在單個作業中使用MultipleInputs類,並且可以在驅動程序類中進行配置。

如果您希望Mapper1的縮減結果與Mapper2的縮減結果分開,那麼您需要配置兩個作業。這兩個作業會有不同的映射器,但會配置相同的reducer類。

1

查看Hadoop中的MultipleOutputs類,以便從reducer中寫入多個文件。根據reduce方法中的條件將輸出寫入第二個文件。