wordcount的處理過程來進行演示mapreduce處理流程如下圖:
1. 輸入分片(input split):在進行map計算之前,mapreduce會根據輸入檔案計算輸入分片(input split),每個輸入分片(input split)針對乙個map任務,輸入分片(input split)儲存的並非資料本身,而是乙個分片長度和乙個記錄資料的位置的陣列,輸入分片(input split)往往和hdfs的block(塊)關係很密切,假如我們設定hdfs的塊的大小是64mb,如果我們輸入有三個檔案,大小分別是3mb、65mb和127mb,那麼mapreduce會把3mb檔案分為乙個輸入分片(input split),65mb則是兩個輸入分片(input split)而127mb也是兩個輸入分片(input split),換句話說我們如果在map計算前做輸入分片調整,例如合併小檔案,那麼就會有5個map任務將執行,而且每個map執行的資料大小不均,這個也是mapreduce優化計算的乙個關鍵點。
2. map階段:就是程式設計師編寫好的map函式了,因此map函式效率相對好控制,而且一般map操作都是本地化操作也就是在資料儲存節點上進行;
3. combiner階段:combiner階段是程式設計師可以選擇的,combiner其實也是一種reduce操作,因此我們看見wordcount類裡是用reduce進行載入的。combiner是乙個本地化的reduce操作,它是map運算的後續操作,主要是在map計算出中間檔案前做乙個簡單的合併重複key值的操作,例如我們對檔案裡的單詞頻率做統計,map計算時候如果碰到乙個hadoop的單詞就會記錄為1,但是這篇文章裡hadoop可能會出現n多次,那麼map輸出檔案冗餘就會很多,因此在reduce計算前對相同的key做乙個合併操作,那麼檔案會變小,這樣就提高了寬頻的傳輸效率,畢竟hadoop計算力寬頻資源往往是計算的瓶頸也是最為寶貴的資源,但是combiner操作是有風險的,使用它的原則是combiner的輸入不會影響到reduce計算的最終輸入,例如:如果計算只是求總數,最大值,最小值可以使用combiner,但是做平均值計算使用combiner的話,最終的reduce計算結果就會出錯。
4. shuffle階段:將map的輸出作為reduce的輸入的過程就是shuffle了,這個是mapreduce優化的重點地方。這裡我不講怎麼優化shuffle階段,講講shuffle階段的原理,因為大部分的書籍裡都沒講清楚shuffle階段。shuffle一開始就是map階段做輸出操作,一般mapreduce計算的都是海量資料,map輸出時候不可能把所有檔案都放到記憶體操作,因此map寫入磁碟的過程十分的複雜,更何況map輸出時候要對結果進行排序,記憶體開銷是很大的,map在做輸出時候會在記憶體裡開啟乙個環形記憶體緩衝區,這個緩衝區專門用來輸出的,預設大小是100mb,並且在配置檔案裡為這個緩衝區設定了乙個閥值,預設是0.80(這個大小和閥值都是可以在配置檔案裡進行配置的),同時map還會為輸出操作啟動乙個守護執行緒,如果緩衝區的記憶體達到了閥值的80%時候,這個守護執行緒就會把內容寫到磁碟上,這個過程叫spill,另外的20%記憶體可以繼續寫入要寫進磁碟的資料,寫入磁碟和寫入記憶體操作是互不干擾的,如果快取區被撐滿了,那麼map就會阻塞寫入記憶體的操作,讓寫入磁碟操作完成後再繼續執行寫入記憶體操作,前面我講到寫入磁碟前會有個排序操作,這個是在寫入磁碟操作時候進行,不是在寫入記憶體時候進行的,如果我們定義了combiner函式,那麼排序前還會執行combiner操作。
每次spill操作也就是寫入磁碟操作時候就會寫乙個溢位檔案,也就是說在做map輸出有幾次spill就會產生多少個溢位檔案,等map輸出全部做完後,map會合併這些輸出檔案。這個過程裡還會有乙個partitioner操作,對於這個操作很多人都很迷糊,其實partitioner操作和map階段的輸入分片(input split)很像,乙個partitioner對應乙個reduce作業,如果我們mapreduce操作只有乙個reduce操作,那麼partitioner就只有乙個,如果我們有多個reduce操作,那麼partitioner對應的就會有多個,partitioner因此就是reduce的輸入分片,這個程式設計師可以程式設計控制,主要是根據實際key和value的值,根據實際業務型別或者為了更好的reduce負載均衡要求進行,這是提高reduce效率的乙個關鍵所在。到了reduce階段就是合併map輸出檔案了,partitioner會找到對應的map輸出檔案,然後進行複製操作,複製操作時reduce會開啟幾個複製執行緒,這些執行緒預設個數是5個,程式設計師也可以在配置檔案更改複製執行緒的個數,這個複製過程和map寫入磁碟過程類似,也有閥值和記憶體大小,閥值一樣可以在配置檔案裡配置,而記憶體大小是直接使用reduce的tasktracker的記憶體大小,複製時候reduce還會進行排序操作和合併檔案操作,這些操作完了就會進行reduce計算了。
5. reduce階段:和map函式一樣也是程式設計師編寫的,最終結果是儲存在hdfs上的。
原文:
MapReduce處理流程
1 把輸出目錄下檔案按照一定的標準進行邏輯切片,形成切片規劃 預設為,split size block size 128m。每乙個切片由乙個maptask處理 2 textinputformat對切片中的資料進行一行一行的讀取,把每一行文字內容解析成鍵 值對。key是每一行的起始位置,value是本...
MapReduce處理流程
mapreduce是hadoop2.x的乙個計算框架,利用分治的思想,將乙個計算量很大的作業分給很多個任務,每個任務完成其中的一小部分,然後再將結果合併到一起。將任務分開處理的過程為map階段,將每個小任務的結果合併到一起的過程為reduce階段。下面先從巨集觀上介紹一下客戶端提交乙個作業時,had...
Mapreduce作業的處理流程
按照時間順序包括 輸入分片 input split map階段 combiner階段 shuffle階段和 reduce階段 輸入分片 input split 在進行map計算之前,mapreduce會根據輸入檔案計算輸入分片 input split 每個輸入分片 input split 針對乙個m...