MapReduce 過程詳解

2022-08-19 11:57:09 字數 4113 閱讀 7009

1:最簡單的過程:

map - reduce

map - partition - reduce

3:增加了在本地先進性一次reduce(本地優化),減少後期網路的傳輸量

map - combine(本地reduce) - partition - reduce

一般說來,乙個完整的mapreduce過程可以分為以上3中提到的4個步驟,下面以hadoop自帶的maxtemperature為例,說明四個步驟的工作:

假設輸入檔案的內容為:

file1:

0043012650999991949032412004+62300+010750fm-12+048599999v0202701n00461220001cn0500001n9+01111+99999999999

0067011990999991950051507004+68750+023550fm-12+038299999v0203301n00671220001cn9999999n9+00001+99999999999

0043012650999991949032418004+62300+010750fm-12+048599999v0202701n00461220001cn0500001n9+00781+99999999999

0043011990999991950051512004+68750+023550fm-12+038299999v0203201n00671220001cn9999999n9+00221+99999999999

0043011990999991950051518004+68750+023550fm-12+038299999v0203201n00261220001cn9999999n9-00111+99999999999

file2:

0043012650999991950032412004+62300+010750fm-12+048599999v0202701n00461220001cn0500001n9+00081+99999999999

0067011990999991949051507004+68750+023550fm-12+038299999v0203301n00671220001cn9999999n9+07001+99999999999

0043012650999991950032418004+62300+010750fm-12+048599999v0202701n00461220001cn0500001n9+00091+99999999999

0043011990999991949051512004+68750+023550fm-12+038299999v0203201n00671220001cn9999999n9+08021+99999999999

0043011990999991949051518004+68750+023550fm-12+038299999v0203201n00261220001cn9999999n9-00451+99999999999

一:map

b.map的輸入通過job的setinputformat指定,預設為textinputformat(每行為一條記錄,以偏移為key,行 內容為value),還可以指定為keyvaluetextinputformat [在org.apache.hadoop.mapred中](每行為一條記錄,分隔符之前為key,之後為value,預設的分隔 符是\t,通過mapred.textinputformat.seperator指定),sequencefileinputformat(鍵和值由用 戶指定,序列檔案為hadoop專用的二進位制壓縮格式),還有nlineinputformat(與textnputormat相同,但每個分片一定由n 行,n預設為1,通過,mapred.line.input.format.linespermap設定[在eclipse的hadoop引數的edit hadoop location中的高階引數設定中])

c.map的輸出與輸入格式類似,反推即可,例如對應sequencefileinputformat,輸出類為sequencefileoutputformat

處理輸入資料,將資料按照使用者想要的形式collect起來

在經過這個步驟後,現在的其中乙個map輸出資料為以下形式:<1949,111>,<1950,0>,<1949,78>,<1950,22>,<1950,-11>

二:combine

combiner是在本地進行的乙個reduce的過程,其目的是提高hadoop的效率。

直接將資料交給下乙個步驟處理,這個例子中存在三個以1950為鍵的記錄,所以在下乙個步驟中需要處理三條<1950,0>,<1950,22>,<1950,-11>記錄,如果先做一次combine,則只需處理一次<1950, 22>的記錄,這樣做的乙個好處就是,當資料量很大時,減少很多開銷。(直接將partition後的結果交給reduce處理,由於 tasktracker並不一定分布在本節點,過多的冗餘記錄會影響io,與其在reduce時進行處理,不如在本地先進性一些優化以提高效率)

三:partition

partitioner相當與乙個分發器,將map處理後的輸出分發給reduce去執行。得到map給的記錄後,他們該分配給哪些reducer來處理呢?hadoop採用的預設的派發方式(預設的partition實現)是根據雜湊值來派發的,但是實際中,這並不能很高效或者按照我們要求的去執行任務。例如,經過預設partition處理後,乙個節點的reducer分配到了20條記錄,另乙個卻分配道了10w萬 條,試想,這種情況效率如何。又或者,我們想要處理後得到的檔案按照一定的規律進行輸出,假設有兩個reducer,我們想要最終結果中part- 00000中儲存的是"h"開頭的記錄的結果,part-00001中儲存其他開頭的結果,這些預設的partitioner是做不到的。所以需要我們自 己定製partition來根據自己的要求,選擇記錄的reducer。

自定義partitioner很簡單,只要自定義乙個類,並且繼承partitioner類,重寫其getpartition方法就好了,在使用的時候通過呼叫job的setpartitionerclass指定一下即可

備註:hadoop的partition過程會根據資料格式,選擇相應的比較規則對資料進行排序

四:reduce

reduce就是所謂的歸併階段,此階段實際上包含三個小的階段:

1、shuffle

分配了reduce任務的節點,通過網路使用http的方式將排序後的輸出結果從每乙個執行map節點的相應分割槽上覆制過來。

2、sort

mapreduce框架根據鍵合併(由於執行map的不同節點可能會產生相同的key-value)、排序reduce節點的輸入資料。

shuffle階段和sort階段同時發生,例如當輸出獲取到的同時,它們也會被合併。

secondarysort(二次排序):

為了在value迭代器返回的值上進行二次排序,應用需要用使用第二個鍵擴充套件原來的鍵,同時定義乙個分組比較器。這些鍵使用所有的鍵進行排序,但是分組的時候使用分組比較器來決定哪些鍵值對放在

放在一起,然後傳送給同乙個reduce呼叫來歸併。分組比較器指定通過job.setgroupingcomparatorclass(class)設定,而排序的順序通過job.setsortcomparatorclass(class)控制。

舉例如下:

例如,假設你想查詢網頁的副本個數同時用最簡單的方式標記他們的url。你的job將會設定如下:

3、reduce

在這個階段,我們的資料是以的方式儲存的,對於每乙個資料都會呼叫reduce方法。 以maxtemperature的例子來說,此時的記錄應該是file 1的reduce前(表述不確切): <1950,22>,file 2的reduce前(表述不確切): <1950,09>,那麼reduce後的結果為<1950,22>。

此時,只要根據需求,處理key和values即可

最終結果:

1949   111

1950    22

1:最簡單的過程:

map - reduce

map - partition - reduce

3:增加了在本地先進性一次reduce(本地優化),減少後期網路的傳輸量

map - combine(本地reduce) - partition - reduce

一般說來,乙個完整的mapreduce過程可以分為以上3中提到的4個步驟,下面以hadoop自帶的maxtemperature為例,說明四個步驟的工作:

假設輸入檔案的內容為:

file1:

MapReduce過程詳解

1.輸入分片 input split 在進行map計算之前,mapreduce會根據輸入檔案計算輸入分片 input split 每個輸入分片 input split 針對乙個map任務。2.map階段 就是我們寫的map函式,map函式效率相對好控制,而且一般map操作都是本地化操作也就是在資料儲...

詳解MapReduce過程

textinputformat的原始碼注釋為 檢視inputformat介面的原始碼注釋我們了解到這個介面的作用為 在inputformat的源 中有如下兩個方法 inputsplit getsplits jobconf job,int numsplits throws ioexception 獲取...

MapReduce過程詳解

資料執行的底層目前還是以hadoop為主,我們主要接觸的還是上層抽象出來的比較方便的資料工具,例如hive,spark,impala等等,那麼hadoop底層的核心原理又是什麼呢?hadoop的底層核心由hdfs,mapreduce和yarn組成,hdfs是大資料的儲存引擎,分布式檔案系統,yarn...