3 MapReduce工作原理
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)
下面通過一個的例子并結合源代碼來詳細說明這個過程
3.1 WordCount示例
這也是Hadoop自帶的一個例子,目標是統計文本文件中單詞的個數。
假設有如下的兩個文本文件來運行WorkCount程序:
Hello World Bye World
Hello Hadoop GoodBye Hadoop
3.2 map數據輸入
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 |
3.4 combine輸出
Combiner類實現將相同key的值合并起來,它也是一個Reducer的實現。
如下是combine1的輸出
Key2 |
Value2 |
Hello |
1 |
World |
2 |
Bye |
1 |
如下是combine2的輸出
Key2 |
Value2 |
Hello |
1 |
Hadoop |
2 |
GoodBye |
1 |
3.5 reduce輸出
Reducer類實現將相同key的值合并起來。
如下是reduce的輸出
Key2 |
Value2 |
Hello |
2 |
World |
2 |
Bye |
1 |
Hadoop |
2 |
GoodBye |
1 |
即實現了WordCount的處理。
未完待續
Annotated Hadoop 作者:naven 日期: