最近在改寫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相同的行匯在一起)
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