mapreduce是hadoop核心框架之一,我們知道hadoop是又分布式檔案系統hdfs和分布式計算框架組成。mapreduce就是一種離線資料計算框架。那麼作為計算機框架的套路,會有輸入經過處理後輸出結構,mapreduce就是將任務分為兩個階段:map階段和reduce階段。每個階段都是用鍵值對(key/value)作為輸入(input)和輸出(output)。而程式設計師要做的就是定義好這兩個階段的函式:map函式和reduce函式。
hadoop mapreduce設計理念**於2023年google發布的mapreduce**,隨後開源界模範google mapreduce設計出了hadoop mapreduce。hadoop mapreduce的主要特點為:
- 易於程式設計
- 良好的擴充套件性
- 高容錯性
- 適合pb級以上的離線海量資料處理
mapreduce擅長的是離線海量的資料處理,當然也存在不擅長的方面,比如說
(1)實時計算。
像mysql一樣在毫秒級或秒級內返回資料處理結果
(2)流式計算
mapreduce的自身設計決定了他的輸入資料必須是靜態的,不能動態變化
(3)dag計算
多個程式存在依賴關係,後乙個應用程式的輸入為前乙個程式的輸出。
mapreduce的執行階段用語言描述會顯得有點抽上,以worldcount為例先上圖吧
從邏輯實體上來講mapreduce的執行機制,根據時間先後有:輸入分片、map階段、(combiner階段)、shuffle階段和reduce階段。
(1)輸入分片
在進行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應用於如下場景:
- 簡單的資料統計,比如**pv,uv的統計
- 搜尋引擎建索引
- 海量資料查詢
- 複雜資料分析演算法實現
-聚類演算法
-分類演算法
-推薦演算法
-圖演算法
未完待續
MapReduce2 0 原理 架構 應用場景
良好的擴充套件性,即可以很容易的增加節點 適合pb級別的資料的離線處理 map階段 輸入資料的解析 inputformat 輸入分組 partitioner 本節點的規約 combiner reduce階段 shuffling階段拉取資料 桶排序,是乙個hash過程,使得相同的key可以排在一堆 資...
MapReduce 2 0應用場景 原理與基本架構
現介紹計算框架mapreduce。mapreduce乙個應用場景是有大量檔案,裡面儲存了單詞,且乙個單詞佔一行 執行任務是如何統計每個單詞出現的次數?類似應用場景有搜尋引擎中,統計最流行的k個搜尋詞以及統計搜尋詞頻率,幫助優化搜尋詞提示 mapreduce將作業的整個執行過程分為兩個階段 map階段...
MapReduce原理及程式設計
二.mapreduce程式設計模型 mapreduce是乙個分布式計算框架 適用於大規模資料處理場景 每個job包含map和reduce兩部分 分而治之 構建抽象模型 map和reduce 隱藏系統層細節 優點 實現 資料定義格式 mapreduce執行過程 必須可序列化 serializableh...