為了說明這個問題,我們使用wordcount的處理過程來進行演示,演示圖如下所示:
分析上圖:
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上的。
hadoop批量計算框架 MapReduce
結合自身的經驗記錄,mapreduce中的一些知識點以及乙個wordcount小實踐 核心思想 分而治之 map程式 需要根據自己的需求開發 shuffle 緩衝區大小設定 core site.xml設定為100m io.file.buffer.size 100000000 以位元組為單位 hdfs...
Hadoop的分布式計算 MapReduce
什麼是mapreduce?你想數出一摞牌中有多少張黑桃。直觀方式是一張一張檢查並且數出有多少張是黑桃。mapreduce方法則是 1.給在座的所有玩家中分配這摞牌 2.讓每個玩家數自己手中的牌有幾張是黑桃,然後把這個數目匯報給你 3.你把所有玩家告訴你的數字加起來,得到最後的結論 1 mapredu...
Hadoop基本原理之一 MapReduce
1 為什麼需要hadoop 目前,一塊硬碟容量約為1tb,讀取速度約為100m s,因此完成一塊硬碟的讀取需時約2.5小時 寫入時間更長 若把資料放在同一硬碟上,且全部資料均需要同乙個程式進行處理,此程式的處理時間將主要浪費在i o時間上。在過去幾十年,硬碟的讀取速度並未明顯增長,而網路傳輸速度此飛...