下圖來源於《Hadoop For Dummies》圖書,示例爲統計每一個航班的飛行航次。node
A:文件存儲到linux系統、windows系統都是以data block的形式來存儲。hdfs會把文件分拆成固定尺寸的data blok。linux
A-->B:HDFS文件系統把預存儲的文件拆分紅多個數據塊(Data Block),每一個數據塊都有兩個副本,即以每一個數據塊三份的形式存儲於HDFS文件系統的不一樣的data node中。windows
C:文件在分解成固定尺寸的數據塊data block時,每一個數據塊data block的最後一條記錄有可能會被分割到下一個數據塊,爲了解決這個問題,在進入數據處理的data block都會被從新計算,會記算一個data block中第一條記錄、最後一條記錄所處的位置,會記錄下一個數據塊位置,以及上個數據塊最後一條記錄在下個數據塊中的偏移,即input splits。緩存
B-->C:爲了保證每一個數據塊中分割時邊界記錄的完整性,每一個data block被從新計算爲input split。網絡
B-->D:在yarn中,每一個mapreduce job開啓時,yarn中的資源管理器都會建立一個 application master守護進程,來監聽mapreduce job的生命週期。application master守護進程會首先向hdfs的namenode節點獲取文件作對應的全部data block的位置,並把data blok計算爲input split。而後application master守護進程向yarn的資源管理器發送請求處理input split,而後進入了map處理階段。app
C-->E:(map階段)map函數處理輸入分片input split,每次讀取分片中的一條記錄,該記錄以記錄偏移k1,記錄自己內容v1的鍵值對形式輸入map()。map函數從每條記錄中進行抽取,表達爲<XX提取詞k2,V2>的鍵值對輸出(v2爲1)。k2/v2鍵值對首先緩存於內存,達到必定字節,會被轉存到data node的磁盤不一樣的分區中。函數
E-->F:(shuffle階段)shuffle階段以k2對不一樣分區的map階段輸出進行聚合,造成爲k2爲鍵、一系列k2對應的v2(在此爲1)值集合爲值的鍵值對形式。而後以k2鍵進行排序,並寫入到本地磁盤不一樣的分區。oop
F-->G:把shuffle階段不一樣分區的輸出經過網絡拷貝到分配有reducer task的data node磁盤的對應分區中。學習
G-->H:(reduce階段)reducer函數處理list(<k2,v2值集合>),造成以k2爲鍵,v3爲值的鍵值對。而後輸出文件存儲到hdfs。spa
後續學習深刻,繼續進行修改!!!歡迎指摘!
學習資料:1,《Hadoop For Dummies》