读者QQ群②:190771709,投稿请发dashuju36@qq.com
我要投稿

MapReduce初级案例——平均成绩

1

作者:虾皮

“平均成绩”主要目的还是在重温经典“ WordCount”例子,可以说是在基础上的微变化版,该实例主要就是实现一个计算学生平均成绩的例子。

1 实例描述

对输入文件中数据进行就算学生平均成绩。输入文件中的每行内容均为一个学生的姓名和他相应的成绩,如果有多门学科,则每门学科为一个文件。要求在输出中每行有两个间隔的数据,其中, 第一个代表学生的姓名, 第二个代表其平均成绩。

样本输入:

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 程序代码

程序代码如下所示:

1 1 1 1 1

4 代码结果

1)准备测试数据

通过 Eclipse 下面的“ DFS Locations”在“ /user/hadoop”目录下创建输入文件“ score_in”文件夹( 备注:“ score_out”不需要创建。)如图 3.4-1 所示,已经成功创建。

1

然后在本地建立三个 txt 文件,通过 Eclipse 上传到“ /user/hadoop/score_in”文件夹中,三个 txt 文件的内容如“实例描述”那三个文件一样。如图 3.4-2 所示,成功上传之后。

备注:文本文件的编码为“ UTF-8”, 默认为“ ANSI”,可以另存为时选择, 不然中文会出现乱码。

从 SecureCRT 远处查看“ Master.Hadoop”的也能证实我们上传的三个文件。

查看三个文件的内容如图 3.4-3 所示:

1

2)查看运行结果

这时我们右击 Eclipse 的“ DFS Locations”中“ /user/hadoop”文件夹进行刷新,这时会发现多出一个“ score_out”文件夹,且里面有 3 个文件,然后打开双其“ part-r-00000”文件,会在 Eclipse 中间把内容显示出来。如图 3.4-4 所示。

1

End.

转载请注明来自36大数据(36dsj.com):36大数据 » MapReduce初级案例——平均成绩

36大数据   除非特别注明,本站所有文章均不代表本站观点。报道中出现的商标属于其合法持有人。请遵守理性,宽容,换位思考的原则。

评论 1

  1. 匿名map函数中,根据MapReduce的机制,value即为输入的一行文本,没必要再“首先安行进行分割”。按照这样运行程序,不会出错,结果也正确,但画蛇添足了,这时只是恰巧没出错。回复