2013-05-22 65 views
4

我從When do reduce tasks start in Hadoop瞭解到,hadoop中的reduce任務包含三個步驟:混洗,排序和減少排序(以及之後的減少)只能在所有映射器完成後纔開始。有沒有辦法開始排序,並減少每次映射器完成。如何開始排序和減少hadoop之前洗牌完成所有mappers?

例如,讓我們只有一個mapper mapperA和mapperB以及2個reducer。我想要做的是:

  1. mapperA完成
  2. 洗牌複製mapperAs輸出相應的分區讓說,以減速機1級2
  3. 排序上減速1和2點開始分揀,減少併產生一些中間輸出
  4. 現在mapperB完成
  5. 混洗拷貝mapperBs輸出的適當分區減速器1和2
  6. 排序和再次減少對減速器1和2點開始和減速器米erges與舊的新產品

這可能嗎?謝謝

回答

3

你不能用當前的實現。但是,人們已經「破解」Hadoop代碼來執行你想要做的事情。

在MapReduce模型中,您需要等待所有映射器完成,因爲這些鍵需要進行分組和排序;此外,您可能會運行一些推測性映射器,但您不知道哪個重複映射器會先完成。

但是,正如"Breaking the MapReduce Stage Barrier"文件指出的,對於某些應用程序,可能不需要等待映射器的所有輸出。如果你想實現這種行爲(最可能用於研究目的),那麼你應該看看org.apache.hadoop.mapred.ReduceTask.ReduceCopier類,它實現ShuffleConsumerPlugin

編輯:最後,如在@teo這個相關SO question指出,

ReduceCopier.fetchOutputs()方法是保持運行,直至所有映射輸出將被複制(通過同時減少 任務的一個Hadoop版本1.0.4第2026行中的 循環)。

2

您可以使用slowstart屬性進行配置,該屬性表示映射器在複製到reducer之前需要完成的百分比。它通常默認是在0.9 - 0.95(90-95%)標誌,但在此之前所有的地圖製作完成是不大不小的Hadoop的反模式(你可以重寫爲0,如果你想

`mapreduce.reduce.slowstart.completed.map` 
+0

是的,但這只是開始洗牌過程。 sortper和reduce只會在mapperB完成後纔會啓動。我想要做的就是在mapperB完成之前開始排序和縮小(我的上述方案中的第3步)。還是我誤解了一些東西? – teo

+0

那麼排序和減少無法啓動,直到所有的映射器輸入都在 –

1

啓動排序過程如果我可以這樣說的話),因爲減速器無法知道在所有映射器完成之前沒有更多的數據可以接收。你,調用者可能知道,根據你對密鑰的定義,partitioner等等,但是reducer沒有。

+0

你是什麼意思,「減速器無法知道沒有更多的數據接收」。他們如何知道所有的映射器都是在正常情況下完成的? – teo

+0

我的意思是減速器無法知道仍在運行的映射器不會在某個時刻發出將根據分區邏輯發送到該減速器的數據。所有Reducer都知道mapper任務正在處理輸入分割:這些分割的內容可能會被你知道(基於先前的輸出),但不是你的reducer。 – davek

+0

是的,你說得對,但對減速機來說重要嗎?我想到的是一旦輸入數據來自映射器並讓他等待,讓Reducer開始工作。如果新數據來自另一個映射器,那麼比我想要Reducer減少它們並將新結果與之前生成的結果合併。當所有的mappers結束時,我認爲reducer將會像正常場景一樣停下來。那可能嗎? – teo

相關問題