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