2012-07-26 54 views

回答

181

縮小階段有3個步驟:混洗,分類,縮小。 Shuffle是減速器從每個映射器收集數據的位置。這可能會在映射器生成數據時發生,因爲它只是數據傳輸。另一方面,只有在完成所有映射器後才能開始排序和縮減。您可以通過查看Reducer完成百分比來確定MapReduce正在執行的操作:0-33%意味着它正在洗牌,34-66%是排序,67%-100%是減少。這就是爲什麼你的減速器有時會看起來「卡住」在33% - 它正在等待映射器完成。

減速器基於完成的映射器的百分比閾值開始混洗。您可以更改參數以使減速器遲早啓動。

爲什麼開始減速機早期是件好事?因爲它隨着時間的推移將數據從映射器傳輸到還原器,如果您的網絡是瓶頸,這是一件好事。

爲什麼開始減速機早期是一件壞事?因爲他們「生硬」減少了插槽,而只複製數據並等待映射器完成。另一項後來開始實際使用減少插槽的作業現在無法使用它們。

您可以通過在mapred-site.xml中更改默認值mapred.reduce.slowstart.completed.maps來自定義減速器啓動時間。值1.00將在啓動減速器之前等待所有映射器完成。值0.0將立即啓動減速器。當映射器的一半完成時,值0.5將啓動減速器。您也可以逐個更改mapred.reduce.slowstart.completed.maps在Hadoop的新版本(至少2.4.1)中,調用的參數是mapreduce.job.reduce.slowstart.completedmaps(感謝用戶yegor256)。

通常情況下,如果系統一次有多個作業運行,我喜歡保留mapred.reduce.slowstart.completed.maps高於0.9。這樣,當他們沒有做任何事情而只是複製數據時,這項工作並沒有減少減速器。如果你只有一次工作,那麼做0.1可能是合適的。

+3

你知道我在哪裏可以閱讀更多關於你所提到的內容嗎? – daydreamer 2012-07-26 22:54:45

+1

Slowstart在我看來是相當糟糕的文檔....因爲是大多數晦澀的配置參數。 – 2012-07-27 14:45:23

+5

很好的答案@Donald Miner。只需要在較新的Hadoop版本中添加(我使用的是1.1.2),該值默認爲0.05。 http://hadoop.apache.org/docs/r1.1.2/mapred-default.html – sufinawaz 2013-09-26 19:46:15

1

盡我所知減少地圖階段的階段開始,並繼續使用地圖記錄。然而,由於在映射階段之後存在排序和混洗階段,所有的輸出必須被分類併發送到減速器。因此,從邏輯上講,您可以想象縮減階段僅在映射階段之後纔開始,但實際上由於性能原因,縮減器也會使用映射器進行初始化。

0

顯示的reduce階段的百分比實際上是從映射輸出複製到reducer輸入目錄的數據量。 要知道此複製何時開始?這是您可以設置爲Donald在上面顯示的配置。一旦所有的數據都被複制到reducer(即100%減少)時,那麼reducer開始工作,因此如果您的reducer代碼是I/O或CPU密集型的,可能會「100%減少」。

3

縮減階段可以在調用reducer之前很久就開始。只要「a」映射程序完成作業,生成的數據就會進行一些排序和混排(包括對組合器和分區程序的調用)。減速器「階段」在映射器數據處理開始後立即開始。隨着這些處理完成,您將看到減少百分比的進展。但是,還沒有一個減速器被調用。根據可用/可用處理器的數量,數據的性質和預期減速器的數量,您可能需要按照上面的@ Donald-miner所述更改參數。

0

考慮一個WordCount示例,以便更好地理解地圖如何減少任務的工作方式。假設我們有一個大文件,說一本小說,我們的任務是找出每個單詞在文件中出現的次數。由於文件很大,因此可能會將其分成不同的塊並在不同的工作節點中複製。字數統計工作由地圖和減少任務組成。 map任務將每個塊作爲輸入並生成一箇中間鍵值對。在這個例子中,由於我們正在計算單詞的出現次數,因此映射器在處理塊時會產生形式(word1,count1),(word2,count2)等的中間結果。所有映射器的中間結果是通過了一個混洗階段,將重新排序中間結果。

假設我們從不同映射器的輸出映射爲以下形式:

地圖1: - (是,24) (狀態32) (以及12)

地圖2: - (我,12) (是,23) (狀態,30)

地圖輸出在同一個密鑰值被給予相同的減速器這樣的方式排序。在這裏,這意味着對應的鍵是,等是相同的reducer.It是減速器產生最終的輸出,在這種情況下,將是: - (和12)(是,47)(我的, 12)(was,62)

0

Reducer任務只在所有映射器的completion之後開始。

但是數據傳輸發生在each映射之後。其實這是一個拉動操作。

這意味着,每次縮減器都會詢問每個maptask是否有一些數據要從Map中恢復。如果他們發現任何一個mapper完成了他們的任務,Reducer會拉取中間數據。

來自Mapper的中間數據存儲在disk中。 而從映射器的數據傳輸,以減少發生通過網絡(Data Locality不會保留在簡化階段)

0

減少僅開始後,所有的映射捕撈的有任務,減速機有那麼它必須等待所有的映射器進行通信直到最後的映射器完成其任務。然而映射器開始將數據傳輸到完成其任務的那一刻。

1

當Mapper完成任務後,Reducer開始工作以減少數據,這是Mapreduce作業。