MapReduce初级案例——平均成绩
作者:虾皮
“平均成绩”主要目的还是在重温经典“ WordCount”例子,可以说是在基础上的微变化版,该实例主要就是实现一个计算学生平均成绩的例子。
1 实例描述
对输入文件中数据进行就算学生平均成绩。输入文件中的每行内容均为一个学生的姓名和他相应的成绩,如果有多门学科,则每门学科为一个文件。要求在输出中每行有两个间隔的数据,其中, 第一个代表学生的姓名, 第二个代表其平均成绩。
样本输入:
2 设计思路
计算学生平均成绩是一个仿“ WordCount”例子,用来重温一下开发 MapReduce 程序的流程。程序包括两部分的内容: Map 部分和 Reduce 部分,分别实现了 map 和 reduce 的功能。
Map 处理的是一个纯文本文件,文件中存放的数据时每一行表示一个学生的姓名和他相应一科成绩。 Mapper 处理的数据是由 InputFormat 分解过的数据集,其中 InputFormat 的作用是将数据集切割成小数据集 InputSplit,每一个 InputSlit 将由一个 Mapper 负责处理。此外,InputFormat 中还提供了一个 RecordReader 的实现,并将一个 InputSplit 解析成<key,value>对提供给了 map 函数。 InputFormat 的默认值是 TextInputFormat,它针对文本文件,按行将文本切割成 InputSlit,并用 LineRecordReader 将 InputSplit 解析成<key,value>对, key 是行在文本中的位置, value 是文件中的一行。
Map 的结果会通过 partion 分发到 Reducer, Reducer 做完 Reduce 操作后,将通过以格式 OutputFormat 输出。
Mapper 最终处理的结果对<key,value>,会送到 Reducer 中进行合并,合并的时候,有相同 key 的键/值对则送到同一个 Reducer 上。 Reducer 是所有用户定制 Reducer 类地基础,它的输入是 key 和这个 key 对应的所有 value 的一个迭代器,同时还有 Reducer 的上下文。
Reduce 的结果由 Reducer.Context 的 write 方法输出到文件中。
3 程序代码
程序代码如下所示:
4 代码结果
1)准备测试数据
通过 Eclipse 下面的“ DFS Locations”在“ /user/hadoop”目录下创建输入文件“ score_in”文件夹( 备注:“ score_out”不需要创建。)如图 3.4-1 所示,已经成功创建。
然后在本地建立三个 txt 文件,通过 Eclipse 上传到“ /user/hadoop/score_in”文件夹中,三个 txt 文件的内容如“实例描述”那三个文件一样。如图 3.4-2 所示,成功上传之后。
备注:文本文件的编码为“ UTF-8”, 默认为“ ANSI”,可以另存为时选择, 不然中文会出现乱码。
从 SecureCRT 远处查看“ Master.Hadoop”的也能证实我们上传的三个文件。
查看三个文件的内容如图 3.4-3 所示:
2)查看运行结果
这时我们右击 Eclipse 的“ DFS Locations”中“ /user/hadoop”文件夹进行刷新,这时会发现多出一个“ score_out”文件夹,且里面有 3 个文件,然后打开双其“ part-r-00000”文件,会在 Eclipse 中间把内容显示出来。如图 3.4-4 所示。
End.