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