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