1. 定義
shuffle是指map任務輸出到reduce任務輸入的過程。
2. 目的
在hadoop集群中,大部分map任務與reduce任務在不同的節點執行。因此,reduce任務在執行時需要跨節點去獲取map的輸出結果。如果集群上有很多作業,那麼網路資源消耗會很嚴重,需要最大化減少不必要的資源。另外,如果map的輸出和reduce的輸入只是簡單的磁碟讀寫操作,那麼磁碟io時間將對作業完成時間產生較大影響,應該減少磁碟io的影響。
所以,shuffle階段的目的有兩個:
<1>在跨節點獲取map輸出時,盡可能減少網路頻寬不必要的消耗。
<2>優化記憶體使用,減少磁碟io操作。
3. shuffle過程解析
圖 1
3.1 map輸出
上圖是官方給出的shuffle的流程圖,但是上圖中的「partition, sort amd spill to disk」過程並沒有說明partition、sort和spill在哪個過程進行,難以理解。因此,我畫了另外一張圖,解釋上圖左半邊的流程(map task),如圖:
圖 2
(1) partition操作
map的輸出結果是多個鍵值對(key/value),將由reduce合併,而集群中有多個reduce,該由哪個reduce負責處理這些鍵值對?答案是mapreduce提供了partitioner介面。
partitioner介面可以根據key或value、以及reduce的數量來決定當前的map輸出結果由哪個reduce處理。(預設方式是,計算key的雜湊值,再對reduce數量取模。比如,計算得到的值是0,則指定第乙個reduce處理)
所以,得到map輸出後,進行partition操作,從而指定某個reduce處理該輸出結果。
(2) spill操作
map輸出時使用的記憶體緩衝區有大小限制,預設是100mb。當輸出結果很多時,記憶體就會被填滿,因此需要將緩衝區的資料寫入磁碟,然後重新使用這塊緩衝區。這個從記憶體往磁碟寫資料的過程被稱為spill(溢位寫)。
溢位寫由單獨乙個執行緒負責,不影響往緩衝區寫map結果的執行緒。所以在溢位寫的過程中,map輸出結果會繼續被寫入記憶體。當緩衝區的資料達到閾值(預設是80%,由屬性 io.sort.spill.percent 設定),溢位寫執行緒啟動,對這80%的記憶體進行溢位寫操作。
在溢位寫把map結果寫到磁碟之前,需要進行兩個重要的操作:sort(排序)和combine(合併)。
sort是把這80%的map結果按照key排序。
另外,因為乙個map的輸出結果會由不同的reduce處理(不同的key通過partition操作計算出來的值不同),所以要將屬於同乙個reduce處理的輸出結果進行combine操作。
(3)merge操作
每次溢位寫都會在磁碟上生成乙個溢位寫檔案,如果map輸出結果很大,那麼將會生成多個溢位寫檔案。(當map任務完成時,會把記憶體緩衝區中最後的結果也寫到乙個溢位寫檔案中)。為了方便後續階段reduce來獲取輸出結果,這些溢位寫檔案將會被合併成乙個檔案,這就是merge操作。
最後,合併後的溢位寫檔案被放在tasktracker的本地目錄下,map端的工作結束。
3.2 reduce輸入
reduce端不斷通過rpc從jobtracker獲取map任務是否完成的資訊。如果reduce端得到通知,shuffle的後半段就開始了。
(1) copy階段
reduce任務啟動一些copy執行緒(預設值是5個執行緒,可設定mapred.reduce.parallel.copies屬性),通過http方式把tasktracker目錄下的map輸出結果複製到記憶體緩衝區(這裡緩衝區大小比map端靈活,是基於jvm的heap size設定的。因為在copy階段不執行reduce操作,所以絕大部分記憶體都給copy執行緒使用)。當緩衝區中的資料達到閾值,就進行溢位寫操作(與map端類似)。
(2) sort階段
其實,這裡的所說的sort更恰當的說是merge,因為排序是在map端進行的,而這個階段的任務是合併來自多個map端的輸出結果。比如,有50個map輸出,而合併因子是10(由io.sort.factor屬性設定),那麼將進行5趟合併,每趟合併10個檔案。最後合併成5個檔案。
(3) reduce階段
對sort階段生成的檔案執行reduce操作,把輸出結果放到hdfs。
Hadoop學習筆記(四)Hadoop偽分布式配置
這一篇是介紹hadoop偽分布式的配置中的hadoop的配置。第一部分是hadoop1.0配置,第二部分是hadoop2.0的配置,大家可以自己選擇檢視。linux配置可以檢視hadoop學習筆記 三 linux環境配置 hadoop的五個核心守護程序有 namenode,secondaryname...
Hadoop學習筆記(四) HBase
hbase是乙個高可靠性 高效能 面向列 可伸縮的分布式儲存系統,它是google bigtable的開源實現,執行於hdfs檔案系統之上,利用mapreduce處理資料,使用zookeeper作為協同服務,因此可以容錯地儲存海量稀疏的資料。海量資料儲存,方便擴充套件 快速的隨機訪問,獨特的設計使得...
Hadoop學習筆記(四) HDFS概述
hdfs hadoop distributed file system 分布式檔案儲存系統。hdfs的架構 mapreduce的結構 namenode 是整個檔案系統的管理節點,它維護著整個檔案系統的檔案目錄樹,檔案 目錄的元資訊和每個檔案對應的資料塊列表。接收使用者的操作請求。檔案包括 fsima...