首页 理论教育 MapReduce实战:WordCount案例分析

MapReduce实战:WordCount案例分析

时间:2023-06-24 理论教育 版权反馈
【摘要】:单词统计是MapReduce 经典案例之一,用于统计大量文件中每个单词出现的次数,本节通过分析一个单词统计案例来深入剖析MapReduce 编程模型。WordCount 的目标是将多个input split 文件输入最终得到文件的词频统计,如图4. 3所示。Mapper 会依次处理每一个对。Reduce 端的Shuffle 过程如图4.7 所示。2)reduce()方法作用调用用户自定义的reduce()方法处理经过Shuffle 后得到的键值对,可得到最终的Word-Count 的输出结果。Context 对象用于保存作业运行的上下文信息。

MapReduce实战:WordCount案例分析

单词统计(WordCount)是MapReduce 经典案例之一,用于统计大量文件中每个单词出现的次数,本节通过分析一个单词统计案例来深入剖析MapReduce 编程模型。

WordCount 的目标是将多个input split 文件输入最终得到文件的词频统计,如图4. 3所示。

(1)Map 阶段

1)文件转换

首先,从文件中读取数据,将用户输入分割成固定大小的分片(split),分片只是一个逻辑概念,并没有实际存储数据,源数据还是以块的形式存储在文件系统上。每一个分片会由MapReduce 框架自动转换成一批键值对( <key,value >对)作为一个Mapper 任务的输入,其中,key 为字节偏移量(该行首字节位置=上一行首字节位置+上一行字符串长度),value 为该行数据内容。Mapper 会依次处理每一个<key,value>对。其具体的转换过程如图4.4 所示。

图4.3 统计大量文件中的单词词频

图4.4 文件转换成<key,value>对过程

2)map()方法作用

用户自定义map 方法用于处理Mapper 任务输入的<key,value >对。map()方法接受<key,value>对作为输入,将每一行数据拆分成单个的单词,记录下每个单词的个数为“1”,生成新的<key,value>对。其中,key 是单词本身,value 一般为“1”。map()方法的转换过程如图4.5 所示。

图4.5 map()方法的转换过程

使用Java 实现时需要定义一个继承自Mapper 的类,并且重写map()方法。以下是具体实现代码。

其中Mapper 类是一个泛型类型,它有四个参数,分别代表map()方法的输入键类型、输入值类型、输出键类型、输出值类型。这里指定输入键类型为LongWritable,输入值类型为Text,输出键类型为Text,输出值类型为IntWritable。这些类型都是Hadoop 自己开发的基本类型,存放于“org.apache.hadoop.io”包中,使用时需要导入相应的包。定义IntWritable 类型的变量one 初始化为“1”,用于记录每个单词出现1 次,最终map 输出的value 就是one。Context 对象用于保存作业运行的上下文信息。整个过程就是将<key,value >对输入,然后将Text 类型的value 转换成字符串类型后,再拆分成一个一个的单词,最后将每个单词及其个数(1 个)形成新的键值对输出。

3)Map 端的Shuffle

map()方法输出新的<key,value>对后(key 是单词,value 值为“1”),Mapper 任务会首先将这些键值对按照key 值排序,这样就能将相同的单词聚集在一起。接着会进行一个Combine过程,也就是对每一个Map 结果进行归并,将key 值相同的value 值累加,得到Mapper 的最终输出结果,即将相同的单词的个数进行局部累加。Map 端的Shuffle 过程如图4.6 所示。(www.xing528.com)

(2)Reduce 阶段

1)Reduce 端的Shuffle

Mapper 的输出结果通过网络传递给Reducer 任务后,Reducer 会先对接收到的各个Mapper 的数据进行合并,然后进行排序,并将相同key 的value 合并到一个集合中,形成新的“ <key,list(value) >”形式的键值对。Reduce 端的Shuffle 过程如图4.7 所示。

2)reduce()方法作用

调用用户自定义的reduce()方法处理经过Shuffle 后得到的键值对,可得到最终的Word-Count 的输出结果。reduce()方法考察每一个<key,list(value) >对,将同一个key 的value 值进行累加,就得到了该key 也就是该单词的个数。reduce()方法的作用过程如果4.8 所示。

图4.6 Map 端的Shuffle 过程

图4.7 reduce 端的Shuffle 过程

图4.8 Reduce()方法的作用过程

使用Java 实现时需要定义一个继承自Reducer 的类,并且重写reduce()方法。以下是具体实现代码,其中Reducer 类是一个泛型类型,它有四个参数,分别代表reduce()方法的输入键类型、输入值类型、输出键类型、输出值类型。其中输入键和输入值类型需要和Mapper 的输出键与输出值类型一致。这里指定输入键类型为Text,输入值类型为IntWritable,输出键类型为Text,输出值类型为IntWritable。reduce()方法遍历输入的每一个键值对,将同一个key 的值进行累加,统计出单词的词频并进行输出。

(3)作业设置

WordCount 进行程序实现时,还需要在main 函数中对作业进行一些设置,如指定输入数据路径和输出文件存放目录,配置Mapper 和Reducer,指定输入输出类型等。其具体代码如下所示。

注意:输出文件的存放目录不能提前存在,否则Hadoop 会报错,并拒绝执行作业。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈