map-reduce入門

map-reduce入門

 

 


最近在改寫mahout源碼,感覺自己map-reduce功力不夠深厚,因此打算系統學習一下。

map-reduce其實是一種編程範式,從統計詞頻(wordCount)程序來講解map-reduce的思想最容易理解。

 

給定一個文件,裏面的內容如下,要求統計每個單詞的詞頻。

Hello Angela

I love you Angela

How are you Angela

 

map(每個單詞處理爲一行,key,value形式)

Hello,1

Angela,1

I,1

love,1

you,1

Angela,1

How,1

are,1

you,1

Angela,1

 

reduce(key相同的行匯在一起)

Hello,<1>

Angela,<1,1,1>

I, <1>

love, <1>

you, <1,1>

How, <1>

are, <1>

 

reducer處理後輸出

Hello,1

Angela,3

I, 1

love, 1

you, 2

How, 1

are, 1

 

從上可以看到,map階段和reduce階段的輸入輸出數據都是key,value形式的。key的存在是爲了標誌哪些數據需要匯在一起處理。顯然,對於上面統計詞頻的例子,我們的目的就是讓同一個單詞的數據落在一起,然後統計該單詞出現了多少次。

 

 

瞭解了map-reduce的思想之後,下面來看看分佈式的map-reduce是怎樣子的。

 

Hadoop有兩類節點,一個jobtracker和一序列的tasktracker。

jobtracker調用tasktracker運行任務,如果其中一個tasktracker任務失敗了,jobtracker會調度另外一個tasktracker節點重新執行任務。

 

Hadoop會將輸入數據進行分片處理,每個分片是一個等大的數據塊,

每個分片會分給一個map任務來依次處理裏面的每行數據。

 

一般來說,合理的分片大小趨向於hdfs一個塊的大小,默認是64MB。從而使得map任務運行在存有輸入數據的節點上,減少數據的網絡傳輸。

 

 

 

 

 

如果有多個reduce任務,那麼map任務會對輸出進行分區,落在同一個分區的數據,留給一個reduce任務處理。當然,相同的key的數據肯定在一個分區中。

 

 

map在輸出到reduce之前,其實還可以存在一個combine任務,即localreduce,在本地做一次數據合併,從而減少數據的傳輸。很多時候,combiner和reducer可以是同一個類。

 

 

 本文作者:linger

 本文鏈接:http://blog.csdn.net/lingerlanlan/article/details/46713733

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章