我在Hadoop 0.20中有一份工作,需要一次處理大文件。 (這是一個預處理步驟,可以將面向文件的數據轉換爲更適合MapReduce的清潔的基於行的格式。)使用零縮減器時,可以從Hadoop獲得單獨排序的映射器輸出嗎?
我不介意我有多少個輸出文件,但每個Map的輸出都可以在最多隻有一個輸出文件,並且每個輸出文件都必須進行排序。
- 如果我使用numReducers = 0運行,它會很快運行,並且每個映射器都會寫出自己的輸出文件,這很好 - 但文件沒有排序。
- 如果我添加一個Reducer(簡單的Reducer.class),那麼會爲單個文件添加一個不必要的全局排序步驟,這需要花費很多個小時(比Map任務要長得多)。
- 如果我添加多個縮減器,各個地圖作業的結果會混合在一起,因此一個Map的輸出會以多個文件結束。
有沒有什麼辦法說服Hadoop對每個作業的輸出執行映射端排序,而無需使用Reducers或其他任何方式來跳過緩慢的全局合併?
我確實有「job.setCombinerClass(Reducer.class)」。當減速器爲零時似乎不起作用。 From Mapper.java:
如果作業有零減少,那麼
所以我想我詢問是否有規避這一點,或其它方式獲取相同的效果的一種方式。 – 2010-06-25 13:01:37Mapper
的輸出直接寫入OutputFormat而不用按鍵排序。太糟糕了。 因此,有可能在映射的'map'叫你不輸出任何東西,只是藏在內存中收集的值(使用足夠的映射器,以確保這不會受到太大)。然後在'cleanup'調用中自己排序這些值然後輸出它們。 – 2010-06-25 13:16:20
是的 - 我想我會自己排序它,雖然每個映射器的內存可能是一個問題...感謝您的輸入。 – 2010-06-25 13:42:15