MapReduce格式的一般形式

时间:2014-11-23 12:43:45

标签: hadoop mapreduce

我正在阅读书中的MapReduce类型和格式" HADOOP The Definitive Guide"。 MapReduce类型的一般形式如下:

  

map:(K1,V1) - >列表(K2,V2)

     

reduce:(K2,list(V2)) - >清单(K3,V3)

  

map:(K1,V1) - >列表(K2,V2)

     

组合:( K2,列表(V2) - >列表(K2,V2)

     

reduce:(K2,list(V2)) - >清单(K3,V3)

如何以这种通用格式解决字数统计问题。假设我有一个文本文件:

  

AAA BBB CCC

     

DDD EEE AAA

     

GGG CCC BBB

现在在(K1,V1)中格式化文本文件

  

格式(K1,V1)

     

(0,AAA BBB CCC)

     

(10,DDD EEE AAA)

     

(21,GGG CCC BBB)

我该怎么办?如果有任何错误,请纠正我。 谢谢!

1 个答案:

答案 0 :(得分:1)

让我们逐步完成对您数据的一系列转换。 我们从原始数据开始:

AAA BBB CCC
DDD EEE AAA
GGG CCC BBB

假设我们使用TextInputFormat作为InputFormat。 然后,映射器的输入将是键,值对看起来像这样:

0 AAA BBB CCC
13 DDD EEE AAA
26 GGG CCC BBB

这里,文件被分成几行。关键是文件中的位置,值是行本身,作为字符串。

地图

映射器需要采用这些行(忽略它们的位置)并将它们转换为键值对的列表。作为示例,让我们将第一行AAA BBB CCC转换为键值对的列表:

AAA 1
BBB 1
CCC 1

我们通过使用空格字符作为分隔符拆分字符串来完成此操作。这里,每个键都是一个单词,值是该单词的计数。请注意,这只是进行映射的一种方法,还有其他同样有效的方法。

在映射所有三行之后,我们得到以下键值对的列表:

AAA 1
BBB 1
CCC 1
DDD 1
EEE 1
AAA 1
GGG 1
CCC 1
BBB 1

按键分组

上面的键,值对按键排序,我们得到:

AAA 1
AAA 1
BBB 1
BBB 1
CCC 1
CCC 1
DDD 1
EEE 1
GGG 1

然后将具有相同密钥的所有值分组到一个列表中(由于它们按密钥排序,因此可以有效地完成):

AAA [1, 1]
BBB [1, 1]
CCC [1, 1]
DDD 1
EEE 1
GGG 1

合并/减少

在这种情况下,组合器和减速器做同样的事情,所以我们假设最初没有组合器。

我们还假设只有一个reducer节点。 (在多个reducer设置中,我们保证相同键的所有值都将转到同一个reducer。)

我们的reducer总结了每个键列表中的元素,产生了:

AAA 2
BBB 2
CCC 2
DDD 1
EEE 1
GGG 1

这是所需的字数。