Hadoop MapReduce過程詳解

2021-10-24 13:29:57 字數 1828 閱讀 2929

1、mapreduce程式讀取檔案的輸入目錄上存放的相應檔案

2、客戶端在submit()方法執行之前獲取要處理的資料資訊,根據集群中的配置形成乙個任務分配規劃

----------------------maptask開始

5、將輸入檔案切分為splits之後,由recordreader物件(預設linerecordreader)進行讀取,以\n作為分隔符,讀取一行資料,返回。key表示每行首字元偏移值,value表示這一行文字內容。

---------------------shuffle開始

7、map邏輯完之後,生成新的鍵值對,把它們通過context.write進行collect資料收集。首先對資料進行分割槽處理,預設使用hashpartitioner。

(key.hashcode() & integer.max_value) % numreducetasks

預設分割槽是根據key的hashcode對reducetasks個數取模得到的

8、然後把資料傳送到環形緩衝區,緩衝區預設是100mb,環形緩衝區達到80%時,觸發spill溢寫,在spill之前會資料進行排序,排序按照key的索引進行字典排序,排序的手段是快速排序

9、如果job設定過combiner,那麼現在就是使用combiner的時候了。將有相同key的key/value對的value加起來,減少溢寫到磁碟的資料量。combiner會優化mapreduce的中間結果,所以它在整個模型中會多次使用。

那哪些場景才能使用combiner呢?從這裡分析,combiner的輸出是reducer的輸入,combiner絕不能改變最終的計算結果。combiner只應該用於那種reduce的輸入key/value與輸出key/value型別完全一致,且不影響最終結果的場景。比如累加,最大值等。注意求平均值不能使用combiner,會影響最終結果

9、合併溢寫檔案:每次溢寫會在磁碟上生成乙個臨時檔案(寫之前判斷是否有combiner),如果map的輸出結果真的很大,有多次這樣的溢寫發生,磁碟上相應的就會有多個臨時檔案存在。當整個資料處理結束之後開始對磁碟中的臨時檔案進行merge合併,因為最終的檔案只有乙個,寫入磁碟,並且為這個檔案提供了乙個索引檔案,以記錄每個reduce對應資料的偏移量。

---------------------maptask結束

---------------------reducetask開始

10、copy階段:reducetask從各個maptask上遠端拷貝一片資料,並針對某一片資料,如果其大小超過一定閾值,則寫到磁碟上,否則直接放到記憶體中。

11、merge階段。這裡的merge如map端的merge動作,只是陣列中存放的是不同map端copy來的數值。copy過來的資料會先放入記憶體緩衝區中,這裡的緩衝區大小要比map端的更為靈活。merge有三種形式:記憶體到記憶體;記憶體到磁碟;磁碟到磁碟。預設情況下第一種形式不啟用。當記憶體中的資料量到達一定閾值,就啟動記憶體到磁碟的merge。與map 端類似,這也是溢寫的過程,這個過程中如果你設定有combiner,也是會啟用的,然後在磁碟中生成了眾多的溢寫檔案。第二種merge方式一直在執行,直到沒有map端的資料時才結束,然後啟動第三種磁碟到磁碟的merge方式生成最終的檔案。

12、合併排序。把分散的資料合併成乙個大的資料後,還會再對合併後的資料排序。

-----------------------shuffle結束

13、對排序後的鍵值對呼叫reduce方法,鍵相等的鍵值對呼叫一次reduce方法,每次呼叫會產生零個或者多個鍵值對,最後把這些輸出的鍵值對寫入到hdfs檔案中。

----------------------reducetask結束

hadoop map reduce 階段筆記

shuffle and sort mr 框架保證 每個 reducer 的輸入都是按照 key 鍵排過序的。shuffle 將map輸出結果送到reducer和排序的功能。1 map 每個map task將結果輸出到環形記憶體緩衝區,當到達一定閾值,則啟動乙個後台程序將快取中的資料 1 按照 red...

Hadoop MapReduce 效能優化

我們時常談論說到mapreduce時,我們都會說它是離線計算框架,磁碟io開銷大,job執行比較慢等等。這一篇部落格,南國系統回顧下mr程式執行慢的原因,以及如何優化mr程式。我們都知道mapreduce是離線計算框架,不同於spark記憶體計算框架模型。乙個標準的mr程式由map方法和reduce...

九 hadoop mapreduce分割槽

一 什麼時候分割槽?1 分割槽的實現 通過繼承partitioner類,實現getpartition方法。public int getpartition key key,value value,int reducetasknumber map結束後得到的每個key value都呼叫該方法,並把key...