购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.1
MapReduce的运算过程

MapReduce为分布式计算模型,分布式计算最早由Google提出。MapReduce将运算的过程分为两个阶段,map和reduce阶段。用户只需要实现map和reduce两个函数即可。这两个函数参数的形式都是以Key-Value的形式成对出现,Key为输出或输出的信息,Value为输入或输出的值。

图4-1展示了MapReduce的运算过程。将大任务交给多个机器分布式进行计算,然后再进行汇总合并。

图4-1

图4-1介绍如下:

第1行,Input为输入源,因为输入源是以分布式形式保存到HDFS上的,所以可以同时开启多个Mapper程序,同时读取数据。读取数据时,Mapper将接收两个输入的参数,第一个Key为读取到的文件的行号,Value为读取到的这一行的数据。

第2~3行,Mapper在处理完成以后,也将输出Key-Value对形式的数据。

第4行,是Reducer接收Mapper输入的数据,在接收数据之前进行排序操作,这个排序操作我们一般称为shuffle。注意,Reducer接收到的Value值是一个数组,多个重复Key的Value会在Reducer程序中合并成数组。

第5行,是Reducer的输出,也是以Key-Value对象的形式对外输出到文件或其他存储设备中。

以WordCount为示例,再为读者讲解一下MapReduce的过程,如图4-2所示。

图4-2

(1)标注为1的部分为Hadoop的HDFS文件系统中的文件,即被处理的数据应该首先保存到HDFS文件系统上。

(2)标注为2的部分,将接收FileInputFormat的输入数据。在处理WordCount示例时,接收到的数据key1为LongWritable类型,即为字节的偏移量。比如,标注为2的部分中第一行输入为0,其中0为字节0下标的开始;第二行为11,则11为文本中第二行字节的偏移量,以此类推。而Value1则为Text即文本类型,其中第一行Hello Jack为读取的第一行的数据,以此类推。然后,此时我们将开发代码对Value1的数据进行处理,以空格或是\t作为分割,分别将Hello和Jack依次输出。此时每一次输出的算是一个字符,所以在Map中的输出格式Key2为Text类型,而Value2则为LongWritable类型。

(3)标注为3的部分,接收Map的输出,所以Key3和Value3的类型应该与Key2和Value2的类型一致。现在我们只需要将Value中的值相加,就可以得到Hello出现的次数。然后直接输出给Key4和Value4。

如果你已经理解了这个MapReduce的过程,接下来就可以快速开发WordCount代码了。

注意: LongWritable和Text为Hadoop中的序列化类型。可以简单理解为Java中的Long和String。 RRPDd4JqDscaHv3kfcn2ZrHb/yqpeymW0we8kyB/ASnBr3vgBU90j7NP93nZXsok

点击中间区域
呼出菜单
上一章
目录
下一章
×