当前位置: 首页 > ai >正文

MR学生总成绩报表以及平均成绩报表(云计算作业20180524)


课程原地址:http://hbust.shiyanbar.com/course/91079

上课老师:李歆

实验时间:20180524

地点:云桌面

实验人:郭畅

 

【实验目的】

1) 理解mapreduce执行原理

2) 理解map,reduce阶段

3) 熟悉mapreduce代码的编写

【实验原理】

需求描述:
对输入文件中数据进行就算学生平均成绩。输入文件中的每行内容均为一个学生的姓名和他相应的成绩,如果有多门学科,则每门学科为一个文件。
要求在输出中每行有两个间隔的数据,其中,第一个代表学生的姓名,第二个代表其平均成绩。
原始数据:
zhangsan    88
lisi    99
wangwu    66
zhaoliu    77
zhangsan    78
lisi    89
wangwu    96
zhaoliu    67
zhansan    80
lisi    82
wangwu    84
zhaoliu    86
设计思路:
Map处理的是一个纯文本文件, 文件中存放的数据时每一行表示一个学生的姓名和他相应一科成绩。Mapper处理的数据是由InputFormat分解过的数据集,其中 InputFormat的作用是将数据集切割成小数据集InputSplit,每一个InputSplit将由一个Mapper负责处理。此 外,InputFormat中还提供了一个RecordReader的实现,并将一个InputSplit解析成`<key,value>`对提 供给了map函数。InputFormat的默认值是TextInputFormat,它针对文本文件,按行将文本切割成InputSlit,并用 LineRecordReaderInputSplit解析成`<key,value>`对,key是行在文本中的位置,value是文件中的 一行。Map的结果会通过partion分发到ReducerReducer做完Reduce操作后,将通过以格式OutputFormat输出。Mapper最终处理的结果对`<key,value>`,会送到Reducer中进行合并,合并的时候,有相同key的键/值对则送到同一个 Reducer上。Reducer是所有用户定制Reducer类地基础,它的输入是key和这个key对应的所有value的一个迭代器,同时还有 Reducer的上下文。Reduce的结果由Reducer.Contextwrite方法输出到文件中

【实验环境】

本本次环境是:centos6.5 + jdk1.7.0_79 + hadoop2.4.1 + eclipse
日志文件source.txt存放在桌面名为`分布式计算MapReduce开发基础`目录下的相应章节中对应的实验名下的文件夹中找寻。
jar包在桌面名为`lib`文件夹下。
工具在/simple/soft目录下

【实验步骤】

一、项目准备阶段

1.1 在linux系统的命令终端上切换到/simple目录,执行命令:touch source.txt创建一个文件。如图1所示


1

 

1.2 simple目录下,执行命令:vim /simple/source.txt编辑该文件,并把数据的信息内容写入到该文件中,数据名称与成绩之间是一个tab,然后在simple目录可以查看到source.txt文件。如图2所示


2

 

1.3 本案例因为需要用到hadoop的计算,所以在编写程序之前需要先启动yarn服务,可以在命令终端执行命令:start-all.sh hdfsyarn服务启动。(查看服务启动共有6项,如果缺少请执行stop-all.sh关闭,重新启动)。如图3所示


3

 

二 程序编写

2.1 eclipse中的项目列表中,右键点击,选择“new“—>Java Project…”新建一个项目“StudentTotalScore” 。 如图4所示


4

 

2.2 在项目src目录下,右键点击,选择“新建”创建一个类文件名称为“TotalScoreMapper”并指定包名” com.simple.total.score” 。如图5所示


5

2.3 在编写“TotalScoreMapper”类之前需要把hadoop相关的jar包导入,首先在项目根目录下创建一个文件夹lib并把指定位置中的包放入该文件中 。如图6所示


 

6

 

2.4 lib下所有的jar包导入到环境变量,首先全选lib文件夹下的jar包文件,右键点击,选择`build path-->add to build path`,添加后,发现在项目下很多奶瓶图标的jar包。如图7所示


7

 

2.5 让类“TotalScoreMapper”继承类Mapper同时指定需要的参数类型,根据业务逻辑修改map类的内容如下。

 

package com.simple.total.score;import java.io.IOException;import java.util.StringTokenizer;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;public class TotalScoreMapper extendsMapper<LongWritable, Text, Text, IntWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {//读取一行数据String val = value.toString();//把读取的数据以换行作为分割符StringTokenizer stringTokenizer = new StringTokenizer(val, "\n");while (stringTokenizer.hasMoreElements()) {StringTokenizer tmp = new StringTokenizer(stringTokenizer.nextToken());//对读取的一行的名称和成绩进行切分并写入到context对象中String username = tmp.nextToken();String score = tmp.nextToken();context.write(new Text(username),new IntWritable(Integer.valueOf(score)));}}}

2.6 在项目src目录下指定的包名” com.simple.total.score”下右键点击,新建一个类名为“TotalScoreReducer “并继承Reducer类,然后添加该类中的代码内容如下所示。

 

package com.simple.total.score;import java.io.IOException;import java.util.Iterator;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;public class TotalScoreReducer extends Reducer<Text, IntWritable, Text, IntWritable> {@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException, InterruptedException {//获取对键值集合遍历对象Iterator<IntWritable> iterator = values.iterator();int sum =0;//循环获取相同键的所有值并计算和while(iterator.hasNext()){int v = iterator.next().get();sum += v;}context.write(key, new IntWritable(sum));}}

 

2.7 在项目src目录下指定的包名” com.simple.total.score”下右键点击,新建一个测试主类名为” TotalScoreJob”并指定main主方法。如图8所示


8

 

2.8添加代码如下所示。

 

package com.simple.avg.score;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class TotalScoreJob {public static void main(String[] args) throws Exception{//获取作业对象Job job = Job.getInstance(new Configuration());//设置主类job.setJarByClass(TotalScoreJob.class);//设置job参数job.setMapperClass(TotalScoreMapper.class);job.setReducerClass(TotalScoreReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//设置job输入输出//FileInputFormat.addInputPath(job, new Path("file:///simple/source.txt"));FileInputFormat.setInputPaths(job, new Path("file:///simple/source.txt"));FileOutputFormat.setOutputPath(job, new Path("file:///simple/output"));System.exit(job.waitForCompletion(true) ? 0 : 1);}}

 

2.9 按照以上的步骤,把mapperreducer阶段以及测试代码编写完毕之后,选中测试类” AvgScoreJob “,右键点击选择`Run as--->Java Application`,查看控制台显示内容查看是否正确执行。如图9所示

 

9

求平均值的代码如下:

让类“AvgScoreMapper”继承类Mapper同时指定需要的参数类型,根据业务逻辑修改map类的内容如下。

 

package com.simple.avg.score;import java.io.IOException;import java.util.StringTokenizer;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;public class AvgScoreMapper extendsMapper<LongWritable, Text, Text, IntWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {//读取一行数据String val = value.toString();//把读取的数据以换行作为分割符StringTokenizer stringTokenizer = new StringTokenizer(val, "\n");while (stringTokenizer.hasMoreElements()) {StringTokenizer tmp = new StringTokenizer(stringTokenizer.nextToken());//对读取的一行的名称和成绩进行切分并写入到context对象中String username = tmp.nextToken();String score = tmp.nextToken();context.write(new Text(username),new IntWritable(Integer.valueOf(score)));}}}

 

在项目src目录下指定的包名” com.simple.avg.score”下右键点击,新建一个类名为“AvgScoreReducer “并继承Reducer类,然后添加该类中的代码内容如下所示。

 package com.simple.avg.score;import java.io.IOException;import java.util.Iterator;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;public class AvgScoreReducer extends Reducer<Text, IntWritable, Text, IntWritable> {@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException, InterruptedException {//获取对键值集合遍历对象Iterator<IntWritable> iterator = values.iterator();int count = 0;int sum =0;//循环获取相同键的所有值并计算和while(iterator.hasNext()){int v = iterator.next().get();sum += v;count++;}int avg = sum/count;context.write(key, new IntWritable(avg));}}

添加代码如下所示。

 

package com.simple.avg.score;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class AvgScoreJob {public static void main(String[] args) throws Exception{//获取作业对象Job job = Job.getInstance(new Configuration());//设置主类job.setJarByClass(AvgScoreJob.class);//设置job参数job.setMapperClass(AvgScoreMapper.class);job.setReducerClass(AvgScoreReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//设置job输入输出//FileInputFormat.addInputPath(job, new Path("file:///simple/source.txt"));FileInputFormat.setInputPaths(job, new Path("file:///simple/source.txt"));FileOutputFormat.setOutputPath(job, new Path("file:///simple/output"));System.exit(job.waitForCompletion(true) ? 0 : 1);}}

 

 

http://www.xdnf.cn/news/11067.html

相关文章:

  • 人工智能产业图谱
  • 讲解wpe抓包,封包
  • A股各概念板块龙头股大全
  • 2006年中文博客封神榜
  • [转]国内优秀论坛之大汇集
  • 关于QQ开心农场外挂 开发
  • 服务器有时候显示美国,美国服务器不通的情况解决方法
  • 《杂记》- 之- 使用windows终端命令查看文件的MD5
  • 网络安全之了解安全托管服务(MSS)
  • python 管理windows客户端_Python管理Windows进程
  • 如何架设传奇服务器 (如何架设服务器:全面指南)
  • catia中的螺旋伞齿轮画法_详解齿轮画法与基本算法,学机械设计快收下吧
  • 2022年底最后汇总的常见路由器默认用户、默认密码、默认登录IP地址,值得收藏备用!
  • 水煮TCPMP(不得不转的好文)
  • 腾讯全面封杀显IPQQ,珊瑚虫作者被捕,飘云作者推出开发
  • Bolt界面引擎QuickStart: SDK,教程和开发环境
  • 皮肤过敏了怎么办?皮肤过敏偏方、皮肤过敏后怎么办?康本治疗最有效。
  • InstallShield 中文函数解释
  • WinRunner:强大的企业级自动化测试工具
  • 30天改变你的人生
  • 海外社媒运营必看:如何注册使用Snapchat?
  • windows安装nginx莫名其妙 CreateFile()权限不够创建问题
  • Cy3标记多糖之蔗糖、麦芽糖、乳糖
  • 全面剖析3721及上网助手
  • 常用日语网址
  • Vue 树状结构控件
  • Ubuntu 配置 Apache
  • Discuz 7.0版块横排显示版块图标和版块简介的方法
  • 什么是串口?什么是并口?串口与并口有什么区别?-道合顺大数据Infinigo
  • 卡巴斯基安全部队 2012 (KIS 2018) 激活key (9月5日更新)=最新卡巴斯基永久激活码