Hadoop的shuffle過程


Hadoop的shuffle過程就是從map端輸出到reduce端輸入之間的過程,這一段應該是Hadoop中最核心的部分,因為涉及到Hadoop中最珍貴的網絡資源,所以shuffle過程中會有很多可以調節的參數,也有很多策略可以研究。這里沒有對shuffle做深入的分析,也沒有讀源代碼,只是根據資料和使用的一些理解。

map端

map過程的輸出是寫入本地磁盤而不是HDFS,但是一開始數據並不是直接寫入磁盤而是緩沖在內存中,緩存的好處就是減少磁盤I/O的開銷,提高合並和排序的速度。默認的內存緩沖大小是100M(可以配置),所以在書寫map函數的時候要盡量減少內存的使用,為shuffle過程預留更多的內存,因為該過程是最耗時的過程。

當緩沖的內存大小使用超過一定的閾值(默認80%),一個后台的線程就會啟動把緩沖區中的數據寫入(spill)到磁盤中,往內存中寫入的線程繼續寫入知道緩沖區滿,緩沖區滿后線程阻塞直至緩沖區被清空。

在數據spill到磁盤的過程中會有一些額外的處理,調用partition函數、combine函數(如果設置)、對數據進行排序(按key排序)。如果發生多次磁盤的溢出寫,會在磁盤上形成幾個溢出寫文件,在map過程結束時,要將這些文件進行合並生成一個大的分區的排序的文件(比較繞)。

另外在寫磁盤的時候才用壓縮的方式將map的輸出結果進行壓縮是減少網絡開銷很有效的方法,對壓縮了解不錯,就不寫了。

reduce端

reduce端可能從n多map的結果中獲取數據,而這些map的執行速度不盡相同,當其中一個map運行結束時,reduce就會從jobtractor中獲取該信息。map運行結束后tasktractor會得到消息,進而將消息匯報給jobtractor,reduce定時從jobtractor獲取該信息,reduce端默認有5個線程從map端拖拉數據。

同樣從map端拖來的數據(pull)先寫到reduce端的緩存中,同樣緩存占用到達一定閾值后會將數據寫到磁盤中,同樣會進行partition、combine、排序等過程。如果形成多個磁盤文件還會進行合並最后一次合並的結果作為reduce的輸入而不是寫入到磁盤中。

reduce的結果將會寫入到HDFS,如果執行任務的節點也是HDFS的一個節點,本地會保存一個副本。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM