您好,登錄后才能下訂單哦!
本篇內容主要講解“MapReduce的工作機制是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MapReduce的工作機制是什么”吧!
靜態圖:
動態圖:
進度和狀態的更新
map任務或reduce 任務中的用戶代碼拋出運行異常
JVM突然退出
節點管理器運行失敗
資源管理器運行失敗
獲得高可用性,HA, 在雙機熱備模式下,運行一對資源管理器是必要的
MapReduce 確保每個reducer 的輸入都是按鍵排序的。系統執行排序、將map輸出作為輸入傳給reducer的過程稱為shuffle.
map 端
map 函數開始產生輸出時,并不是簡單地將它寫入到磁盤。這個過程更為復雜,它利用緩沖的方式寫到內存并出于效率的考慮進行預排序。
每個map任務都有一個環形內存緩沖區用于存儲任務存儲任務輸出。在默認情況下,緩沖區的大小為100Mb,這個值可以通過改變mapreduce.task.io.sort.mb性來調整。一但鍰沖內容達到閾值(mapreduce.map.sort.spill.percent,默認為0.80,或80%),一個后臺線程便開始把內容溢出(spill)到磁盤。在溢出寫到磁盤過程中,map輸出繼續寫到緩沖區,但如果在此期間緩沖區被填滿,map會被阻塞直到寫磁盤過程完成。溢出寫過程按輪詢方式將緩沖區中的內容寫到mapreduce.cluster.local.dir屬性在作業特定子目錄下指定的目錄中。
在寫磁盤之前,線程首先根據數據最終要傳的reducer把數據劃分成相應的分區(partition)。在每個分區中,后臺線程按鍵進行內存中排序,如果有一個combiner函數,它就在排序后的輸出上運行。運行combiner函數使得map輸出結果更緊湊,因此減少寫到磁盤的數據和傳遞給reducer的數據。
每次內存緩沖區達到溢出閾值,就會新建一個溢出文件(spill file),因此在map任務寫完其最后一個輸出記錄之后,會有幾個溢出文件。在任務完成之前,溢出文件被合并成一個已分區且已排序的輸出文件。配置屬性mapreduce.task.io.sort.factor控制著一次最多能合并多少流,默認值是10。
如果至少存在3個溢出文件(通過mapreduce.map.combine.minspills屬性設置)時,則combiner就會在輸出文件寫到磁盤之前再次運行。前面曾講過,combiner可以在輸人上反復運行,但并不影響最終結果。如果只有1或2個溢出文件,那么由于map輸出規模減少,因而不值得調用combiner帶來的開銷,因此不會為該map輸出再次運行combiner。
在將壓縮map輸出寫到磁盤的過程中對它進行壓縮往往是個很好的主意,因為這樣會寫磁盤的速度更快,節約磁盤空間,并且減少傳給reducer的數據量。在默認情況下,輸出是不壓縮的,但只要將mapreduce.map.output.compress設置為true,就可以輕松啟用此功能。使用的壓縮庫由mapreduce.map.output.compress.codec指定。
reducer通過HTTP得到輸出文件的分區。用于文件分區的工作線程的數量由任務的mapreduce.shuffle.max.threads屬性控制,此設置針對的是每一個節點管理器,而不是針對每個map任務。默認值0將最大線程數設置為機器中處理器數量的兩倍。
給shuffle 過程盡量多提供內存空間
寫map函數和reduce 函數時盡量少用內存,不應該無限使用內存
在map端,可以通過避免多次溢出寫磁盤來獲得最佳性能
在reduce端,中間數據全部駐留在內存時,就能獲得最佳性能
reduce 端
配置調優
推測執行 并行執行過程中,對于拖后腿的任務,Hadoop不會嘗試診斷或修復執行緩慢的任務,相反,在一個任務運行比預期慢的時候,它會盡量檢測,并啟動另一個相同的任務作為備份。這就是所謂的“推測執行”
OutputCommitters
hadoop MapReduce 使用一個提交協議來確保作業和任務都完全成功或失敗。這個行為通過對作業使用OutputCommitters 來實現
到此,相信大家對“MapReduce的工作機制是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。