MapReduce簡介和過程淺析
預備知識:什麽是hadoop,HDFS?
Hadoop是一個開源框架,它允許在整個集群使用簡單編程模型計算機的分布式環境存儲並處理大數據。它的目的是從單一的服務器到上千臺機器的擴展,每一個臺機都可以提供本地計算和存儲。
HDFS全稱為Hadoop Distributed File System(分布式文件系統),可以粗淺得理解成將很大的文件分成固定大小的小片,存儲在多個計算機上,更詳細的參考:https://www.cnblogs.com/codeOfLife/p/5375120.html
1、什麽是mapreduce?
Map/Reduce是一個用於大規模數據處理的分布式計算編程模型,用戶在使用時,需要定義Map和Reduce函數。
map函數用來處理原始數據(初始鍵值對)以生成一批中間的key/value對,reduce函數將所有這些中間的有著相同key的values合並起來。
2、mapreduce運行大致過程。
兩個計算階段:
(1)Map
由一個或者多個MapTask組成。
每個MapTask處理輸入數據集合中的一片數據(InputSplit),並將產生的若幹個數據片段(一個數據文件)寫到本地磁盤上。
(2)Reduce
由一個或者多個ReduceTask組成。
ReduceTask則從每個MapTask上遠程拷貝相應的數據片段,經分組聚集和歸約後,將結果寫到HDFS上作為最終結果。
3、MapTask
執行過程概述:
首先,通過用戶提供的InputFormat將對應的InputSplit解析成一系列key/value,並依次交給用戶編寫的map()函數處理,接著按照指定的Partition對數據分片,以確定每個key/value將交給哪個ReduceTask處理,之後將數據交給用戶定義的Combiner進行一次本地合並(沒有則直接跳過),最後即將處理結果保存到本地磁盤上。
具體步驟:
(1)Read階段:MapTask通過用戶編寫的RecordReader,從輸入InputSplit中解析出一個個key/value。
(2)Map階段:該階段只要是將解析出的key/value交給用戶編寫的map()函數處理,並產生一系列新的key/value。
(3)Collect階段:在用戶編寫的map()函數中,當數據處理完成後,一般會調用OutputCollector.collect()輸出結果。在該函數內部,它會將生成的ley/value分片(通過調用Partition),並寫入一個環形內存緩沖區中。
(4)Spill階段:即“溢寫”,當環形緩沖區滿後,MapReduce會將數據寫到本地磁盤上,生成一個臨時文件。需要註意的是,將數據寫入本地磁盤之前,先要對數據進行一次本地排序,並在必要時對數據進行合並操作。
(5)Combine階段:當所有數據處理完成後,MapTask對所有臨時文件進行一次合並,以確保最終只會生成一個數據文件。
4、ReduceTask
執行過程概述:
ReduceTask的輸入數據來自各個MapTask,因此首先通過HTTP請求從各個已經運行完成的MapTask所在TaskTracker機器上拷貝相應的數據分片,待所有數據拷貝完成後,再以key為關鍵字對所有數據進行排序(sort),通過排序,key相同的記錄聚集到一起形成若幹分組,然後將分組數據交給用戶編寫的reduce()函數處理,並將數據結果直接寫到HDFS上作為最終輸出結果。
具體步驟:
(1)Shuffle階段:也稱為Copy階段。ReduceTask從各個MapTask所在的TaskTracker上遠程拷貝一片數據,並針對某一片數據,如果其大小超過一定閾值,則寫到磁盤上,否則直接放到內存中。
(2)Merge階段:在遠程拷貝數據的同時,ReduceTask啟動了兩個後臺線程對內存和磁盤上的文件進行合並,以防止內存使用過多或磁盤上的文件過多,並且可以為後面整體的歸並排序減負,提升排序效率。
(3)Sort階段:按照MapReduce的語義,用戶編寫的reduce()函數輸入數據是按key進行聚集的一組數據。為了將key相同的數據聚集在一起,Hadoop采用了基於排序的策略。由於各個MapTask已經實現了自己的處理結果進行了局部排序,因此,ReduceTask只需要對所有數據進行一次歸並排序即可。
(4)Reduce階段:在該階段中,ReduceTask將每組數據依次交給用戶編寫的reduce()函數處理。
(5)Write階段:reduce()函數將計算結果寫到HDFS上。
參考資料:http://szjian.iteye.com/blog/2100848
MapReduce簡介和過程淺析