1. 程式人生 > >MapReduce執行原理

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執行過程圖