MapReduce 过程详解 (用WordCount作为例子)
本文轉(zhuǎn)自 http://www.cnblogs.com/npumenglei/
....
先創(chuàng)建兩個(gè)文本文件, 作為我們例子的輸入:
File 1 內(nèi)容:
My name is Tony
My company is pivotal
File 2 內(nèi)容:
My name is Lisa
My company is EMC
1. 第一步, Map
顧名思義, Map 就是拆解.
首先我們的輸入就是兩個(gè)文件, 默認(rèn)情況下就是兩個(gè)split, 對(duì)應(yīng)前面圖中的split 0, split 1
兩個(gè)split 默認(rèn)會(huì)分給兩個(gè)Mapper來(lái)處理,WordCount例子相當(dāng)?shù)乇┝Γ?這一步里面就是直接把文件內(nèi)容分解為單詞和 1 (注意, 不是具體數(shù)量, 就是數(shù)字1)其中的單詞就是我們的主健,也稱為Key, 后面的數(shù)字就是對(duì)應(yīng)的值,也稱為value.
那么對(duì)應(yīng)兩個(gè)Mapper的輸出就是:
split 0
My 1
name 1
is 1
Tony 1
My 1
company 1
is 1
Pivotal 1
split 1
My 1
name 1
is 1
Lisa 1
My 1
company 1
is 1
EMC 1
2. Partition
Partition 是什么? Partition 就是分區(qū)。
為什么要分區(qū)? 因?yàn)橛袝r(shí)候會(huì)有多個(gè)Reducer, Partition就是提前對(duì)輸入進(jìn)行處理, 根據(jù)將來(lái)的Reducer進(jìn)行分區(qū). 到時(shí)候Reducer處理的時(shí)候, 只需要處理分給自己的數(shù)據(jù)就可以了。
如何分區(qū)? 主要的分區(qū)方法就是按照Key 的不同,把數(shù)據(jù)分開(kāi),其中很重要的一點(diǎn)就是要保證Key的唯一性, 因?yàn)閷?lái)做Reduce的時(shí)候有可能是在不同的節(jié)點(diǎn)上做的, 如果一個(gè)Key同時(shí)存在于兩個(gè)節(jié)點(diǎn)上, Reduce的結(jié)果就會(huì)出問(wèn)題, 所以很常見(jiàn)的Partition方法就是哈希。
結(jié)合我們的例子, 我們這里假設(shè)有兩個(gè)Reducer, 前面兩個(gè)split 做完P(guān)artition的結(jié)果就會(huì)如下:
split 0
Partition 1:
company 1
is 1
is 1
Partition 2:
My 1
My 1
name 1
Pivotal 1
Tony 1
split 1
Partition 1:
company 1
is 1
is 1
EMC 1
Partition 2:
My 1
My 1
name 1
Lisa 1
其中Partition 1 將來(lái)是準(zhǔn)備給Reducer 1 處理的, Partition 2 是給Reducer 2 的
這里我們可以看到, Partition 只是把所有的條目按照Key 分了一下區(qū), 沒(méi)有其他任何處理, 每個(gè)區(qū)里面的Key 都不會(huì)出現(xiàn)在另外一個(gè)區(qū)里面。
3. Sort
Sort 就是排序嘍, 其實(shí)這個(gè)過(guò)程在我來(lái)看并不是必須的, 完全可以交給客戶自己的程序來(lái)處理。 那為什么還要排序呢? 可能是寫(xiě)MapReduce的大牛們想,“大部分reduce 程序應(yīng)該都希望輸入的是已經(jīng)按Key排序好的數(shù)據(jù), 如果是這樣, 那我們就干脆順手幫你做掉啦, 請(qǐng)叫我雷鋒!” ......好吧, 你是雷鋒.
那么我們假設(shè)對(duì)前面的數(shù)據(jù)再進(jìn)行排序, 結(jié)果如下:
split 0
Partition 1:
company 1
is 1
is 1
Partition 2:
My 1
My 1
name 1
Pivotal 1
Tony 1
split 1
Partition 1:
company 1
EMC 1
is 1
is 1
Partition 2:
Lisa 1
My 1
My 1
name 1
這里可以看到, 每個(gè)partition里面的條目都按照Key的順序做了排序
4. Combine
什么是Combine呢? Combine 其實(shí)可以理解為一個(gè)mini Reduce 過(guò)程, 它發(fā)生在前面Map的輸出結(jié)果之后, 目的就是在結(jié)果送到Reducer之前先對(duì)其進(jìn)行一次計(jì)算, 以減少文件的大小, 方便后面的傳輸。 但這步也不是必須的。
按照前面的輸出, 執(zhí)行Combine:
split 0
Partition 1:
company 1
is 2
Partition 2:
My 2
name 1
Pivotal 1
Tony 1
split 1
Partition 1:
company 1
EMC 1
is 2
Partition 2:
Lisa 1
My 2
name 1
我們可以看到, 針對(duì)前面的輸出結(jié)果, 我們已經(jīng)局部地統(tǒng)計(jì)了is 和My的出現(xiàn)頻率, 減少了輸出文件的大小。
5. Copy
下面就要準(zhǔn)備把輸出結(jié)果傳送給Reducer了。 這個(gè)階段被稱為Copy, 但事實(shí)上雷子認(rèn)為叫他Download更為合適, 因?yàn)閷?shí)現(xiàn)的時(shí)候, 是通過(guò)http的方式, 由Reducer節(jié)點(diǎn)向各個(gè)mapper節(jié)點(diǎn)下載屬于自己分區(qū)的數(shù)據(jù)。
那么根據(jù)前面的Partition, 下載完的結(jié)果如下:
Reducer 節(jié)點(diǎn) 1 共包含兩個(gè)文件:
Partition 1:
company 1
is 2
Partition 1:
company 1
EMC 1
is 2
Reducer 節(jié)點(diǎn) 2 也是兩個(gè)文件:
Partition 2:
My 2
name 1
Pivotal 1
Tony 1
Partition 2:
Lisa 1
My 2
name 1
這里可以看到, 通過(guò)Copy, 相同Partition 的數(shù)據(jù)落到了同一個(gè)節(jié)點(diǎn)上。
6. Merge
如上一步所示, 此時(shí)Reducer得到的文件是從不同Mapper那里下載到的, 需要對(duì)他們進(jìn)行合并為一個(gè)文件, 所以下面這一步就是Merge, 結(jié)果如下:
Reducer 節(jié)點(diǎn) 1
company 1
company 1
EMC 1
is 2
is 2
Reducer 節(jié)點(diǎn) 2
Lisa 1
My 2
My 2
name 1
name 1
Pivotal 1
Tony 1
7. Reduce
終于可以進(jìn)行最后的Reduce 啦...這步相當(dāng)簡(jiǎn)單嘍, 根據(jù)每個(gè)文件中的內(nèi)容最后做一次統(tǒng)計(jì), 結(jié)果如下:
Reducer 節(jié)點(diǎn) 1
company 2
EMC 1
is 4
Reducer 節(jié)點(diǎn) 2
Lisa 1
My 4
name 2
Pivotal 1
Tony 1
至此大功告成! 我們成功統(tǒng)計(jì)出兩個(gè)文件里面每個(gè)單詞的數(shù)目, 同時(shí)把它們存入到兩個(gè)輸出文件中, 這兩個(gè)輸出文件也就是傳說(shuō)中的part-r-00000 和part-r-00001, 看看兩個(gè)文件的內(nèi)容, 再回頭想想最開(kāi)始的Partition, 應(yīng)該是清楚了其中的奧秘吧。
如果你在你自己的環(huán)境中運(yùn)行的WordCount只有part-r-00000一個(gè)文件的話, 那應(yīng)該是因?yàn)槟闶褂玫氖悄J(rèn)設(shè)置, 默認(rèn)一個(gè)job只有一個(gè)reducer
如果你想設(shè)兩個(gè), 你可以:
1. 在源代碼中加入 job.setNumReduceTasks(2), 設(shè)置這個(gè)job的Reducer為兩個(gè)
或者
2. 在 mapred-site.xml 中設(shè)置下面參數(shù)并重啟服務(wù)
<property>
<name>mapred.reduce.tasks</name>
<value>2</value>
</property>
這樣, 整個(gè)集群都會(huì)默認(rèn)使用兩個(gè)Reducer
結(jié)束語(yǔ):
本文大致描述了一下MapReduce的整個(gè)過(guò)程以及每個(gè)階段所作的事情, 并沒(méi)有涉及具體的job,resource的管理和控制, 因?yàn)槟莻€(gè)是第一代MapReduce框架和Yarn框架的主要區(qū)別。 而兩代框架中上述MapReduce 的原理是差不多的,希望對(duì)大家有所幫助。
總結(jié)
以上是生活随笔為你收集整理的MapReduce 过程详解 (用WordCount作为例子)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: css实现hover显示下拉菜单
- 下一篇: 意难平是什么意思(你知道什么叫意难平吗?