MR原理


三、MapReduce運行原理

1、Map過程簡述:

1)讀取數據文件內容,對每一行內容解析成<k1,v1>鍵值對,每個鍵值對調用一次map函數

2)編寫映射函數處理邏輯,將輸入的<k1,v1>轉換成新的<k2,v2>

3)對輸出的<k2,v2>按reducer個數和分區規則進行分區

4)不同的分區,按k2進行排序、分組,將相同的k2的value放到同一個集合中

5)(可選)將分組后的數據重新reduce歸約

2、reduce處理過程:

1)對多個Map的輸出,按不同分區通過網絡將copy到不同的reduce節點

2)對多個map的輸出進行排序,合並,編寫reduce函數處理邏輯,將接收到的數據轉化成<k3,v3>

3)將reduce節點輸出的數據保存到HDFS上

說明:

1)Mapper Task 是邏輯切分。因為Maper記錄的都是block的偏移量,是邏輯切分,但相對於內存中他確實是物理切分,因為每個Mapper都是記錄的分片段之后的數據。

2)shuffle是物理切分。MapReduce的過程是倆過程需要用到Shuffle的,1個mapper的Shufflle,1個多個reduce的Shuffle,一般每個計算模型都要多次的reduce,所以要用到多次的Shuffle。.

 

 

 

MapReduce原理圖

正常HDFS存儲3份文件,Jar包默認寫10份,NameNode通過心跳機制領取HDFS任務,運行完畢后JAR包會被刪除。

Map端處理流程分析:

   1) 每個輸入分片會交給一個Map任務(是TaskTracker節點上運行的一個Java進程),默認情況下,系統會以HDFS的一個塊大小作為一個分片(hadoop2默認128M,配置dfs.blocksize)。Map任務通過InputFormat將輸入分片處理成可供Map處理的<k1,v1>鍵值對。

   2) 通過自己的Map處理方法將<k1,v1>處理成<k2,v2>,輸出結果會暫時放在一個環形內存緩沖(緩沖區默認大小100M,由mapreduce.task.io.sort.mb屬性控制)中,當緩沖區快要溢出時(默認為緩沖區大小的80%,由mapreduce.map.sort.spill.percent屬性控制),會在本地操作系統文件系統中創建一個溢出文件(由mapreduce.cluster.local.dir屬性控制,默認${hadoop.tmp.dir}/mapred/local),保存緩沖區的數據。溢寫默認控制為內存緩沖區的80%,是為了保證在溢寫線程把緩沖區那80%的數據寫到磁盤中的同時,Map任務還可以繼續將結果輸出到緩沖區剩余的20%內存中,從而提高任務執行效率。

   3) 每次spill將內存數據溢寫到磁盤時,線程會根據Reduce任務的數目以及一定的分區規則將數據進行分區,然后分區內再進行排序、分組,如果設置了Combiner,會執行規約操作。

   4) 當map任務結束后,可能會存在多個溢寫文件,這時候需要將他們合並,合並操作在每個分區內進行,先排序再分組,如果設置了Combiner並且spill文件大於mapreduce.map.combine.minspills值(默認值3)時,會觸發Combine操作。每次分組會形成新的鍵值對<k2,{v2...}>。

   5) 合並操作完成后,會形成map端的輸出文件,等待reduce來拷貝。如果設置了壓縮,則會將輸出文件進行壓縮,減少網絡流量。是否進行壓縮,mapreduce.output.fileoutputformat.compress,默認為false。設置壓縮庫,mapreduce.output.fileoutputformat.compress.codec,默認值org.apache.hadoop.io.compress.DefaultCodec。

   Reduce端處理流程分析:

   1) Reduce端會從AM那里獲取已經執行完的map任務,然后以http的方法將map輸出的對應數據拷貝至本地(拷貝最大線程數mapreduce.reduce.shuffle.parallelcopies,默認值5)。每次拷貝過來的數據都存於內存緩沖區中,當數據量大於緩沖區大小(由mapreduce.reduce.shuffle.input.buffer.percent控制,默認0.7)的一定比例(由mapreduce.reduce.shuffle.merge.percent控制,默認0.66)時,則將緩沖區的數據溢寫到一個本地磁盤中。由於數據來自多個map的同一個分區,溢寫時不需要再分區,但要進行排序和分組,如果設置了Combiner,還會執行Combine操作。溢寫過程與map端溢寫類似,輸出寫入可同時進行。

   2) 當所有的map端輸出該分區數據都已經拷貝完畢時,本地磁盤可能存在多個spill文件,需要將他們再次排序、分組合並,最后形成一個最終文件,作為Reduce任務的輸入。此時標志Shuffle階段結束,然后Reduce任務啟動,將最終文件中的數據處理形成新的鍵值對<k3,v3>。

   3) 將生成的數據<k3,v3>輸出到HDFS文件中。

 

 

Map與Reduce執行過程圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM