1. 程式人生 > >MapReduce中各個階段的分析

MapReduce中各個階段的分析

MapReduce中各個階段的分析:

在MapReduce的各個階段:

在檔案被讀入的時候呼叫的是Inputformat方法讀入的。inputformat——>recordreader——>read(一行) 。在這裡讀入一行,返回的是(k,v)的形式,key是行號的偏移量,value的值是這一行的內容。

在上述的過程中,之後是呼叫map方法,將以上內容轉換成正真的(key,value)的形式。key為值,value為1,然後呼叫context.write方法將該資料寫出來。

從map端寫出來之後具體寫到outputcollector收集器中。

經過outputcollector收集器之後會寫入到環形緩緩區中。在環形緩衝區中會做幾件事情,①排序,呼叫的是快速排序法。②分割槽,呼叫的是hashpartitioner分割槽。達到80%之後會溢寫磁碟。分割槽中hashpartitioner分割槽的時候是按照key進行hash取值的。相同的hash值會在一個分割槽中,取幾個分割槽可以人為設定。排序的時候的兩個依據是partition和key兩個作為依據的。同一個partition中是按照key進行排序的。

環形緩衝區中的資料會spill溢寫到磁碟中。

在溢寫到磁碟之後會merge,歸併排序,將多個小檔案merge成大檔案的。所以合併之後的大檔案還是分割槽,並且分割槽內部是有序的。

在這裡map階段就算結束了,後邊就是reduce階段了,reduce階段會去map階段merge之後的檔案中拿資料,按照相同的分割槽去取資料。reduce中是有分割槽號的,將資料拿過來之後會儲存在本地磁碟中。

取完資料之後會按照相同的分割槽,再將取過來的資料進行merge歸併排序,大檔案的內容按照key有序進行排序。

之後會呼叫groupingcomparator進行分組,之後的reduce中會按照這個分組,每次取出一組資料,呼叫reduce中自定義的方法進行處理。

最後呼叫outputformat會將內容寫入到檔案中。

 

在這裡map端輸入的(key,value)的型別我們人為可以指定,一般會設定為(LongWritable,Text),為什麼會是longwritable呢,因為map端正真進來的時候是切分之後的檔案。key的值是讀取的行的偏移量。