3 回答

TA貢獻1868條經驗 獲得超4個贊
首先shuffling是將數據從映射器傳輸到簡化器的過程,所以我認為對于簡化器來說很明顯是必要的,因為否則,它們將無法獲得任何輸入(或每個映射器的輸入) 。改組甚至可以在地圖階段完成之前開始,以節省一些時間。因此,當地圖狀態尚未達到100%時,您會看到縮小狀態大于0%(但小于33%)。
Sorting為減速器節省時間,幫助它輕松區分何時應開始新的減速任務。簡單地說,當排序后的輸入數據中的下一個鍵與上一個鍵不同時,它只是啟動一個新的reduce任務。每個reduce任務都會獲取一個鍵值對列表,但是它必須調用reduce()方法,該方法接受一個key-list(value)輸入,因此必須按鍵對值進行分組。如果在映射階段對輸入數據進行了預排序(本地),而在歸約階段簡單地進行了歸并排序(因為歸約器從許多映射器獲取數據),則這樣做很容易。
Partitioning您在其中一個答案中提到的,是一個不同的過程。它確定映射相位的輸出(鍵,值)對將發送到哪個減速器。默認的分區程序在鍵上使用哈希將其分配給reduce任務,但是您可以覆蓋它并使用自己的自定義分區程序。
這些步驟的重要信息來源是此Yahoo教程。
下面是一個很好的圖形表示形式(在此圖中,混洗稱為“復制”):
請注意,如果您指定零個減速器(setNumReduceTasks(0))shuffling,sorting則根本不會執行和。然后,MapReduce作業在地圖階段停止,并且地圖階段不包括任何種類的排序(因此,即使地圖階段也更快)。
更新:由于您正在尋找更正式的東西,因此您也可以閱讀Tom White的書“ Hadoop:權威指南”。這是您問題的有趣部分。
Tom White自2007年2月以來一直是Apache Hadoop的提交者,并且是Apache Software Foundation的成員,因此我認為它是相當可信且正式的...

TA貢獻1848條經驗 獲得超6個贊
讓我們回顧一下Mapreduce程序的關鍵階段。
該地圖相由映射器來完成。映射器在未排序的輸入鍵/值對上運行。每個映射器為每個輸入鍵/值對發出零個,一個或多個輸出鍵/值對。
該組合相由合成器來完成。該組合應結合鍵/值對具有相同的密鑰。每個組合器可以運行零次,一次或多次。
在洗牌和排序階段是由框架來完成。來自所有映射器的數據按鍵分組,在化簡器中拆分,然后按鍵排序。每個化簡器獲得與同一鍵關聯的所有值。程序員可以提供用于排序的自定義比較功能,以及用于數據拆分的分區程序。
該分區決定哪些減速會得到一個特定的鍵值對。
該減速器取得排序鍵/ [值列表]對,排序由所述密鑰。值列表包含由映射器生成的具有相同鍵的所有值。每個縮減器為每個輸入鍵/值對發出零,一個或多個輸出鍵/值對。
看看這個javacodegeeks 文章由瑪麗亞Jurcovicova和mssqltips由達塔為了更好的理解文章

TA貢獻1827條經驗 獲得超4個贊
我想到的只是添加以上答案中缺少的幾點。從這里獲取的這張圖清楚地說明了實際情況。
如果我再說一遍的真正目的
拆分:通過在不同節點(映射程序)之間分配處理負載來改善并行處理,這將節省總體處理時間。
合并:縮小每個Mapper的輸出。這樣可以節省將數據從一個節點移動到另一個節點的時間。
排序(隨機排序):使運行時可以輕松地計劃(生成/啟動)新的reducer,在瀏覽排序項目列表時,只要當前鍵與先前的鍵不同,就可以生成一個新的reducer 。
- 3 回答
- 0 關注
- 687 瀏覽
添加回答
舉報