2011-07-23 67 views
1

我正在使用Hadoop的MapReduce。我有一個文件作爲map函數的輸入,map函數做了一些事情(與問題無關)。我想讓縮減器取得地圖的輸出並寫入兩個不同的文件。 我看到它(我希望有一個有效的解決方案)的方式,也有在我的腦海裏有兩種方式:使用Hadoop並行還原mapreduce

  1. 1減速,這將知道,以識別不同的情況,並寫入到2個不同的上下文。
  2. 2個並行reducer,每個人都知道識別他的相關輸入,忽略另一個,這樣每個人都會寫入一個文件(每個reducer將寫入不同的文件)。

我更喜歡第一種解決方案,因爲這意味着我只會查看map的輸出,而不是兩次並行 - 但如果第一個不支持某種方式 - 我會很高興聽到第二個建議的解決方案。

*注意:這兩個最終文件應該是分開的,不需要加入它們。

+1

您是否考慮過從映射器中發出兩個單獨的鍵的選項,每種映射器都有一個輸出? –

+0

如果沒有選擇兩個文件中每個文件的標準,則可以只有兩個reducer併發出鍵/值對。來自一個reducer的所有鍵/值將進入一個文件,其餘的將進入另一個文件。 –

+0

我們需要了解更多關於如何識別每種記錄類型的信息(正如@David所說的 - 如果您可以爲映射器中的每種記錄類型創建不同的密鑰,那麼您可以對該密鑰進行hadoop分區,並將每條記錄發送至其特定減速器)。 – cftarnas

回答

3

Hadoop API具有用於創建多個輸出的功能,稱爲MultipleOutputs,這使您可以選擇首選解決方案。

1

如果您在地圖階段知道記錄必須轉到哪個文件,則可以使用指定要將哪個文件轉到的特殊鍵來標記映射輸出。例如,如果記錄R1必須轉到文件1,那麼您應該輸出< 1,R1> ...(1是key .. file1的符號表示形式,R1是值)如果Record R2必須轉到文件2 ,你的地圖輸出將是< 2,R2>。

然後,如果您將地圖縮小作業配置爲僅使用2個縮減器,它將確保所有使用< 1 _ _標記的記錄將被髮送到1個縮減器,並且將向另一個發送< 。

這會比你的首選解決方案更好,因爲你仍然只能通過你的地圖輸出一次..同時,它將是並行的。