Map-Reduce框架的運(yùn)作完全基于<key,value>對(duì),即數(shù)據(jù)的輸入是一批<key,value>對(duì),生成的結(jié)果也是一批<key,value>對(duì),只是有時(shí)候它們的類(lèi)型不一樣而已。Key和value的類(lèi)由于需要支持被序列化(serialize)操作,所以它們必須要實(shí)現(xiàn)Writable接口,而且key的類(lèi)還必須實(shí)現(xiàn)WritableComparable接口,使得可以讓框架對(duì)數(shù)據(jù)集的執(zhí)行排序操作。
一個(gè)Map-Reduce任務(wù)的執(zhí)行過(guò)程以及數(shù)據(jù)輸入輸出的類(lèi)型如下所示:
(input)<k1,v1> -> map -> <k2,v2> -> combine -> <k2,v2> -> reduce -> <k3,v3>(output)
下面通過(guò)一個(gè)的例子并結(jié)合源代碼來(lái)詳細(xì)說(shuō)明這個(gè)過(guò)程
這也是Hadoop自帶的一個(gè)例子,目標(biāo)是統(tǒng)計(jì)文本文件中單詞的個(gè)數(shù)。
假設(shè)有如下的兩個(gè)文本文件來(lái)運(yùn)行WorkCount程序:
Hello Hadoop GoodBye Hadoop
|
3.2 map數(shù)據(jù)輸入
Hadoop針對(duì)文本文件缺省使用LineRecordReader類(lèi)來(lái)實(shí)現(xiàn)讀取,一行一個(gè)key/value對(duì),key取偏移量,value為行內(nèi)容。
如下是map1的輸入數(shù)據(jù):
Key1
|
Value1
|
0
|
Hello World Bye World
|
如下是map2的輸入數(shù)據(jù):
Key1
|
Value1
|
0
|
Hello Hadoop GoodBye Hadoop
|
3.3 map輸出/combine輸入
如下是map1的輸出結(jié)果
Key2
|
Value2
|
Hello
|
1
|
World
|
1
|
Bye
|
1
|
World
|
1
|
如下是map2的輸出結(jié)果
Key2
|
Value2
|
Hello
|
1
|
Hadoop
|
1
|
GoodBye
|
1
|
Hadoop
|
1
|
Combiner類(lèi)實(shí)現(xiàn)將相同key的值合并起來(lái),它也是一個(gè)Reducer的實(shí)現(xiàn)。
如下是combine1的輸出
Key2
|
Value2
|
Hello
|
1
|
World
|
2
|
Bye
|
1
|
如下是combine2的輸出
Key2
|
Value2
|
Hello
|
1
|
Hadoop
|
2
|
GoodBye
|
1
|
Reducer類(lèi)實(shí)現(xiàn)將相同key的值合并起來(lái)。
如下是reduce的輸出
Key2
|
Value2
|
Hello
|
2
|
World
|
2
|
Bye
|
1
|
Hadoop
|
2
|
GoodBye
|
1
|
即實(shí)現(xiàn)了WordCount的處理。
未完待續(xù)
Annotated Hadoop 作者:naven 日期:2007-12-29