上一期我們介紹了MR的基本流程與概念,本期稍微深入瞭解一下這個流程,尤其是比較重要但相對較少被提及的Shuffling過程。
Mapping
上期我們說過,每一個mapper程式接收並處理一塊資料,這塊資料的大小預設就是一個HDFS資料塊大小。
Mapper處理資料時,基於效能考慮,會使用快取,快取的大小有一個預設值(比如100MB),滿了之後,將會寫入磁碟檔案。
不過在寫入之前,會在記憶體中進行分割槽(partition),分割槽的數量取決於reducer的數量,實際上也就是由MR框架決定,例如上圖中是3個。在每個分割槽內,資料會被按key進行排序,都完成之後,這些資料才會被寫入磁碟。
由於快取可能多次被佔滿(上圖中是3次),從而導致多次磁碟寫入,產生多個磁碟檔案,所以每個mapper結束之後,需要對自己所產生的多個檔案進行合併(merge),合併出來的大檔案同樣進行分割槽及分割槽內的排序。
通常,這個合併後的檔案會被壓縮,以便減少磁碟儲存成本,同時也有利於降低shuffling時的網路傳輸成本。
這些都完成之後,這個所謂的“中間結果”檔案,就靜靜地等待reducer來獲取。
Reducing
當一個mapper完成工作之後,所有的reducer們都會收到通知,開始去取該mapper產生的資料檔案,不同的reducer取走不同的分割槽內的資料。
所以取數這一步,並不是等到所有的mapper都完成才開始,而是某個mapper一完成,reducer就會去取。
當所有mapper都完成,所有的中間結果都已被拷貝至reducer,才開始真正的reduce操作,對取來的多個分割槽資料進行合併和統一排序,終端使用者所寫的reduce方法會作用在排序後的每一條資料上,以產生最終結果。
Shuffling
上述所說的發生在mapping與reducing之間的資料排序、合併、及拷貝的過程,包括mapping側的一部分好reducing側的一部分,即圖中紅色框出部分,統稱為shuffling。
這一步驟的特點是什麼?就是重磁碟IO、重網路IO,知道這一點很重要。
- END -
好了,本期就先到這兒,下一期講講MR的優點、侷限性等內容。
喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師雜書館,提前獲得更多更新內容,以及領取大資料及Java經典資料。