今天我們一起了解下大數據計算引擎MapReduce。MapReduce是一種編程模型,用于大規模數據集(大于1TB)的并行運算。MapReduce的核心思想就是“分而治之”,其主要包括Map階段和Reduce階段。
1.MapReduce技術架構
圖 1 HDFS技術架構
(1)Map階段負責“分”,即把複雜的任務分解為若幹個“簡單的任務”來處理。“簡單的任務”包含三層含義:一是數據或計算的規模相對原任務要大大縮小;二是就近計算原則,即任務會分配到存放着所需數據的節點上進行計算;三是這些小任務可以并行計算,彼此間幾乎沒有依賴關系。
(2)Reduce階段負責對map階段的結果進行彙總。至于需要多少個Reduce,用戶可以根據具體問題,通過在mapred-site.xml配置文件裡設置參數mapred.reduce.tasks的值,默認值為1。
2.MapReduce的工作原理
圖 2 MapReduce的工作原理
從最上方的user program開始執行程序,user program鍊接了MapReduce庫,實現了最基本的Map函數和Reduce函數。執行的順序如下:
1)MapReduce庫先把user program的輸入文件劃分為M份(M為用戶定義),每一份通常有16MB到64MB,例如分成split0~4;然後使用fork将用戶進程拷貝到集群内其它機器上。
2.user program的副本中有一個稱為master,其餘稱為worker,master是負責調度的,為空閑worker分配作業(Map作業或者Reduce作業),worker的數量也是可以由用戶指定的。
3.被分配了Map作業的worker,開始讀取對應分片的輸入數據,Map作業數量是由M決定的,和split一一對應;Map作業從輸入數據中抽取出鍵值對,每一個鍵值對都作為參數傳遞給map函數,map函數産生的中間鍵值對被緩存在内存中。
4.緩存的中間鍵值對會被定期寫入本地磁盤,而且被分為R個區,R的大小是由用戶定義的,将來每個區會對應一個Reduce作業;這些中間鍵值對的位置會被通報給master,master負責将信息轉發給Reduce worker。
5.master通知分配了Reduce作業的worker它負責的分區在什麼位置(肯定不止一個地方,每個Map作業産生的中間鍵值對都可能映射到所有R個不同分區),當Reduce worker把所有它負責的中間鍵值對都讀過來後,先對它們進行排序,使得相同鍵的鍵值對聚集在一起。因為不同的鍵可能會映射到同一個分區也就是同一個Reduce作業,所以排序是必須的。
6.reduce worker遍曆排序後的中間鍵值對,對于每個唯一的鍵,都将鍵與關聯的值傳遞給reduce函數,reduce函數産生的輸出會添加到這個分區的輸出文件中。
7.當所有的Map和Reduce作業都完成了,master喚醒正版的user program,MapReduce函數調用返回user program的代碼。
所有執行完畢後,MapReduce輸出放在了R個分區的輸出文件中(分别對應一個Reduce作業)。用戶通常并不需要合并這R個文件,而是将其作為輸入交給另一個MapReduce程序處理。整個過程中,輸入數據是來自底層分布式文件系統HDFS的,中間數據是放在本地文件系統的,最終輸出數據是寫入底層分布式文件系統HDFS的。而且我們要注意Map/Reduce作業和map/reduce函數的區别:Map作業處理一個輸入數據的分片,可能需要調用多次map函數來處理每個輸入鍵值對;Reduce作業處理一個分區的中間鍵值對,期間要對每個不同的鍵調用一次reduce函數,Reduce作業最終也對應一個輸出文件。
3.MapReduce的處理流程詳解
我們以單詞統計為例,分别介紹map階段和reduce階段的處理過程。單詞統計的業務過程是統計一個文件中的每個單詞出現的次數,業務過程大緻如下:
圖 3單詞統計業務過程
1.MapReduce的map階段主要把讀入的數據進行分區處理,并進行數據排序、分組,其具體流程如下:
圖 4map階段數據處理過程
1)讀取HDFS文件數據,按照行解析成<k,v>格式;
2)對1輸出的<k,v>經過程序處理按照新的邏輯輸出新的<k,v>;
3)對<k,v>進行分區處理;
4)各分區分别對輸入的<k,v>進行排序,分組。
2.reduce階段是對數據進行合并,并輸出結果的過程,其處理過程主要如下:
圖 5 Reduce階段處理流程
Reduce階段主要是對map階段的輸出結果進行合并,排序處理後輸出結果到HDFS上。
4.MapReduce的特點
1)MapReduce的優點
易于編程:如果要編寫分布式程序,隻需實現一些簡單接口,與編寫普通程序類似,避免了複雜過程。
良好的擴展性:當計算資源不能得到滿足的時候,可以通過簡單的增加機器來擴展它的計算能力。
高容錯性:MapReduce程序在執行過程中如果有其中一台機器挂了,它可以把計算任務轉移到另外一個正常節點上運行,而且這個過程不需要人工參與,而完全是由Hadoop内部完成的。
适合海量數據的離線處理:MapReduce由于其分布式計算的能力,因此可以實現上幹台服務器集群并發工作,提供海量數據的處理能力。
2)MapReduce的缺點
不适用實時計算:由于MapReduce每次計算結果需要落地到磁盤上,會導緻大量的磁盤IO操作,因此不适合做實時數據的計算。
不适合流式計算:流式計算的輸入數據是動态的,而MapReduce的輸入數據集是靜态的,不能動态變化。這是因為MapReduce自身的設計特點決定了數據源必須是靜态的。
不适合DAG有向圖計算:因為每個MapReduce作業的輸出結果都會寫入到磁盤,會造成大量的磁盤IO,導緻性能非常低下,因此不适合做DAG有向圖計算。
5.MapReduce的應用場景
1)單詞統計;
2)簡單的數據統計,比如網站的PV和UV統計;
3)搜索引擎建立索引;
4)搜索引擎中,統計最流行的K個搜索詞;
5)統計搜索詞頻率,幫助優化搜索詞提示;
6)複雜數據分析算法實現。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!