大數據學習記錄(day6)-圖說Mapreduce工作機制

學習來源:http://www.aboutyun.com/thread-5641-1-1.html
http://www.aboutyun.com/thread-5595-1-1.html


一、Mapreduce 整個工作機制圖。

圖中1:表示待處理數據,比如日誌,比如單詞計數
圖中2:表示map階段,對他們split,然後送到不同分區
圖中3:表示reduce階段,對這些數據整合處理。
圖中4:表示二次mapreduce,這個是mapreduce的鏈式
二、MapReduce Shuffle和排序
Mapreduce爲了確保每個reducer的輸入都按鍵排序。系統執行排序的過程-----將map的輸出作爲輸入傳給reducer稱爲shuffle。學習shuffle是如何工作的有助於我們理解mapreduce工作機制。
shuffle屬於hadoop不斷被優化和改進的代碼庫的一部分。從許多方面看,shuffle是mapreduce的“心臟”,是奇蹟出現的地方。
下面這張圖介紹了mapreduce裏shuffle的工作原理:

從圖可以看出shuffle發生在map端和reduce端之間,將map端的輸出與reduce端的輸入對應。
1、map 端
map函數開始產生輸出時,並不是簡單地將它輸出到磁盤。這個過程更復雜,利用緩衝的方式寫到內存,並出於效率的考慮進行預排序。shuffle原理圖就看出來。
每個map任務都有一個環形內存緩衝區,用於存儲任務的輸出。默認情況是100MB,可以通過io.sort.mb屬性調整。一旦緩衝內容達到閥值(io.sort.spill.percent,默認0.80,或者80%),一個後臺線程開始把內容寫到磁盤中。在寫磁盤過程中,map輸出繼續被寫到緩衝區,但如果在此期間緩衝區被填滿,map會阻塞直到寫磁盤過程完成。在寫磁盤之前,線程首先根據數據最終要傳送到reducer把數據劃分成相應的分區,在每個分區中,後臺線程按鍵進行內排序,如果有一個combiner,它會在排序後的輸出上運行。
reducer通過HTTP方式得到輸出文件的分區。用於文件分區的工作線程的數量由任務的tracker.http.threads屬性控制,此設置針對每個tasktracker,而不是針對每個map任務槽。默認值是40,在運行大型作業的大型集羣上,此值可以根據需要調整。
2、reducer端
map端輸出文件位於運行map任務的tasktracker的本地磁盤,現在,tasktracker需要爲分區文件運行reduce任務。更進一步,reduce任務需要集羣上若干個map任務完成,reduce任務就開始複製其輸出。這就是reduce任務的複製階段。reduce任務有少量複製線程,所以能並行取得map輸出。默認值是5個線程,可以通過設置mapred.reduce.parallel.copies屬性改變。
在這個過程中我們由於要提到一個問題,reducer如何知道要從那個tasktracker取得map輸出呢?
map任務成功完成之後,它們通知其父tasktracker狀態已更新,然後tasktracker通知jobtracker。這些通知都是通過心跳機制傳輸的。因此,對於指定作業,jobtracker知道map輸出和tasktracker之間的映射關係。reduce中的一個線程定期詢問jobtracker以便獲得map輸出的位置,直到它獲得所有輸出位置。
由於reducer可能失敗,因此tasktracker並沒有在第一個reducer檢索到map輸出時就立即從磁盤上刪除它們。相反,tasktracker會等待,直到jobtracker告知它可以刪除map輸出,這是作業完成後執行的。
如果map輸出相當小,則會被複制到reduce tasktracker的內存(緩衝區大小由mapred.job.shuffle.input.buffer.percent屬性控制),否則,map輸出被複制到磁盤。一旦內存緩衝區達到閥值大小(由mapred.job.shuffle.merge.percent決定)或達到map輸出閥值(mapred.inmem.merge.threshold控制),則合併後溢出寫到磁盤中。
隨着磁盤上副本的增多,後臺線程會將它們合併爲更大的、排好序的文件。這會爲後面的合併節省一些時間。注意,爲了合併,壓縮的map輸出都必須在內存中被解壓縮。
複製完所有map輸出被複制期間,reduce任務進入排序階段(sort phase 更恰當的說法是合併階段,因爲排序是在map端進行的),這個階段將合併map輸出,維持其順序排序。這是循環進行的。比如,如果有50個map輸出,而合併因子是10 (10默認值設置,由io.sort.factor屬性設置,與map的合併類似),合併將進行5趟。每趟將10個文件合併成一個文件,因此最後有5箇中間文件。
在最後階段,即reduce階段,直接把數據輸入reduce函數,從而省略了一次磁盤往返行程,並沒有將5個文件合併成一個已排序的文件作爲最後一趟。最後的合併既可來自內存和磁盤片段。
在reduce階段,對已排序輸出中的每個鍵都要調用reduce函數。此階段的輸出直接寫到輸出文件系統中。
小結:
今天通過一張圖進一步瞭解了MapReduce的工作機制,同時學習了將map的輸出作爲輸入傳給reducer的Shuffle執行過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章